J'écris un script shell en bash. À un moment donné du script, il détecte que la machine doit être redémarrée avant de continuer. Il délivre:
sudo reboot
Lorsque la machine revient, il y a plus de travail que ce script doit faire. Comment configurer quelque chose pour continuer à faire le travail dans ce script?
Je suppose qu'il y a un endroit où je peux écrire un script shell tel qu'il sera exécuté au prochain redémarrage. Où est un tel endroit? Je vois que cron a une directive @reboot. Je sais également que des services tels qu'Apache sont démarrés au démarrage par upstart. Est-ce que l'un ou l'autre de ces mécanismes serait approprié? Si oui, comment serait-il déclenché?
Ce script ne doit être exécuté qu'une seule fois, pas à chaque redémarrage. Il devra donc aller quelque part qui ne s'exécute qu'au prochain redémarrage, ou être capable de se supprimer une fois qu'il a été exécuté.
Cette question demande comment enregistrer l'état de votre application après le redémarrage. Mon script n'a pas beaucoup d'état, je peux donc gérer cela. J'ai juste besoin de savoir comment ce script peut déclencher quelque chose à exécuter après le prochain redémarrage.
Ma version spécifique est Ubuntu Linux 14.04. Le script d'origine est démarré sur la ligne de commande par un administrateur système (par opposition à l'exécution à partir de cron).
la source
Réponses:
Sur un système, la seule chose qui est vraiment persistante est un fichier. C'est à peu près ce que vous devez utiliser. Voici une solution utilisant un script init.d.
Prenons le script (simple) suivant
/etc/init.d/myupdate
:Si vous l'activez avec
update-rc.d myupdate defaults
, l'start
action sera exécutée au démarrage. Maintenant, lorsque votre script de mise à jour appelle un redémarrage:Avec cette solution, vous pouvez diviser votre script de mise à jour en deux parties:
Il exécutera la
before_reboot
section de code, créera un fichier/var/run
et redémarrera. Au démarrage, le script sera appelé à nouveau, mais puisque le fichier existe,after_reboot
sera appelé à la place debefore_reboot
.Notez que
update-rc.d
nécessite des privilèges root.Sans utiliser de fichier (d' après le commentaire de Stephen Ostermiller ):
Si vous connaissez l'
getopts
utilitaire, vous souhaiterez peut-être utiliser des options au lieu de fichiers. Dans le script init, appelez le script avec:Et dans votre script, vérifiez les options plutôt que les fichiers. Appelez votre script une fois sans l'option, et init.d le rappellera au démarrage, cette fois avec
-r
.Vous trouverez plus d'informations sur la gestion des options ici (pour les options courtes uniquement) . J'ai également édité mon script avec des appels à
update-rc.d
garder ce travail ponctuel (à partir d'un autre commentaire).la source
/path/to/update/script --after-reboot
partir/etc/init.d/myupdate
plutôt que de compter sur la présence de/var/run/rebooting-for-updates
. Ensuite, il aurait différents arguments lors de l'exécution directe vs appelé au démarrage.update-rc.d myupdate defaults
etupdate-rc.d myupdate remove
dans le script lui-même, ainsi que l'écriture et la suppression de/etc/init.d/myupdate
sorte qu'il ne laisse pas de fichiers en suspens.INIT INFO
section: wiki.debian.org/LSBInitScripts