Estoy escribiendo un script de shell en bash. En algún momento del script, detecta que la máquina necesita reiniciarse antes de continuar. Emite:
sudo reboot
Cuando la máquina vuelve a funcionar, hay más trabajo que este script necesita hacer. ¿Cómo configuro algo para continuar haciendo el trabajo en este script?
Supongo que hay un lugar donde puedo escribir un script de shell para que se ejecute en el próximo reinicio. ¿Dónde está ese lugar? Veo que cron tiene una directiva @reboot. También sé que los servicios como Apache se inician en el arranque por arranque. ¿Sería alguno de esos mecanismos apropiados? Si es así, ¿cómo se activaría?
Este script solo necesita ejecutarse una vez, no cada reinicio. Por lo tanto, tendrá que ir a algún lugar que solo se ejecute en el próximo reinicio, o podrá eliminarse una vez que se haya ejecutado.
Esta pregunta se refiere a cómo guardar el estado de su aplicación para después del reinicio. Mi script no tiene mucho estado, así que puedo manejarlo. Solo necesito saber cómo hacer que este script active algo para que se ejecute después del próximo reinicio.
Mi versión específica es Ubuntu Linux 14.04. El administrador del sistema inicia el script original en la línea de comandos (en lugar de ejecutarlo desde cron).
fuente
Respuestas:
En un sistema, lo único que es realmente persistente es un archivo. Eso es más o menos lo que debes usar. Aquí hay una solución usando un script init.d.
Consideremos el siguiente script (simple)
/etc/init.d/myupdate
:Si lo activa con
update-rc.d myupdate defaults
, lastart
acción se ejecutará al arrancar. Ahora, cuando su script de actualización requiere un reinicio:Con esta solución, puede dividir su script de actualización en dos partes:
Ejecutará la
before_reboot
sección de código, creará un archivo/var/run
y se reiniciará. Tras el arranque, el script se llama de nuevo, pero ya que el archivo existe,after_reboot
se llama en lugar debefore_reboot
.Tenga en cuenta que
update-rc.d
requiere privilegios de root.Sin usar un archivo (del comentario de Stephen Ostermiller ):
Si está familiarizado con la
getopts
utilidad, es posible que desee utilizar opciones en lugar de archivos. En el guión de inicio, llame al guión con:Y en su secuencia de comandos, busque opciones en lugar de archivos. Llame a su script una vez sin la opción, e init.d lo llamará nuevamente en el arranque, esta vez con
-r
.Encontrará más información sobre el manejo de opciones aquí (solo para opciones cortas) . También edité mi script con llamadas a
update-rc.d
para mantener este trabajo por única vez (de otro comentario).fuente
/path/to/update/script --after-reboot
desde en/etc/init.d/myupdate
lugar de confiar en la presencia de/var/run/rebooting-for-updates
. Entonces tendría diferentes argumentos cuando se ejecuta directamente frente a invocado en el arranque.update-rc.d myupdate defaults
yupdate-rc.d myupdate remove
en el script en sí, así como la escritura y eliminación/etc/init.d/myupdate
para que no deje los archivos por ahí.INIT INFO
sección: wiki.debian.org/LSBInitScripts