Piszę skrypt powłoki w bash. W pewnym momencie skryptu wykrywa, że komputer musi zostać ponownie uruchomiony przed kontynuowaniem. Wydaje:
sudo reboot
Po powrocie komputera ten skrypt musi wykonać więcej pracy. Jak skonfigurować coś, aby kontynuować pracę w tym skrypcie?
Zakładam, że jest miejsce, w którym mogę napisać skrypt powłoki, który zostanie wykonany przy następnym restarcie. Gdzie jest takie miejsce? Widzę, że cron ma dyrektywę @reboot. Wiem też, że usługi takie jak Apache są uruchamiane przy starcie przez upstart. Czy któryś z tych mechanizmów byłby odpowiedni? Jeśli tak, w jaki sposób zostałby uruchomiony?
Ten skrypt musi zostać uruchomiony tylko raz, nie przy każdym ponownym uruchomieniu. Więc będzie musiał iść gdzieś, który po prostu uruchomi się przy następnym restarcie lub będzie w stanie usunąć się po uruchomieniu.
To pytanie dotyczy sposobu zapisania stanu aplikacji po ponownym uruchomieniu. Mój skrypt nie ma wiele stanów, więc mogę sobie z tym poradzić. Muszę tylko wiedzieć, jak uruchomić ten skrypt, aby uruchomił się po następnym restarcie.
Moja konkretna wersja to Ubuntu Linux 14.04. Oryginalny skrypt jest uruchamiany w wierszu poleceń przez administratora systemu (w przeciwieństwie do uruchamiania z crona).
źródło
Odpowiedzi:
W systemie jedyną rzeczą, która jest naprawdę trwała, jest plik. Właśnie tego powinieneś użyć. Oto rozwiązanie za pomocą skryptu init.d.
Rozważmy następujący (prosty) skrypt
/etc/init.d/myupdate
:Jeśli go aktywujesz
update-rc.d myupdate defaults
,start
akcja zostanie wykonana podczas rozruchu. Teraz, gdy skrypt aktualizacji wymaga ponownego uruchomienia:Dzięki temu rozwiązaniu możesz podzielić skrypt aktualizacji na dwie części:
Wykona
before_reboot
sekcję kodu, utworzy plik/var/run
i uruchomi się ponownie. Po uruchomieniu skrypt zostanie ponownie wywołany, ale ponieważ plik istnieje,after_reboot
zostanie wywołany zamiastbefore_reboot
.Uwaga:
update-rc.d
wymaga uprawnień roota.Bez użycia pliku (z komentarza Stephena Ostermillera ):
Jeśli znasz
getopts
narzędzie, możesz użyć opcji zamiast plików. W skrypcie init wywołaj skrypt za pomocą:W skrypcie sprawdź opcje zamiast plików. Zadzwoń do skryptu jeden raz bez opcji, a init.d wywoła go ponownie przy starcie, tym razem z
-r
.Więcej informacji na temat obsługi opcji znajduje się tutaj (tylko w przypadku krótkich opcji) . Zredagowałem też mój skrypt z wezwaniami, aby
update-rc.d
zachować to jednorazową pracę (z innego komentarza).źródło
/path/to/update/script --after-reboot
ze/etc/init.d/myupdate
zamiast polegać na obecności/var/run/rebooting-for-updates
. Wtedy miałby inne argumenty, gdy był uruchamiany bezpośrednio vs wywoływany podczas rozruchu.update-rc.d myupdate defaults
iupdate-rc.d myupdate remove
do samego skryptu, a także pisać i usuwać,/etc/init.d/myupdate
aby nie pozostawiać plików w miejscu.INIT INFO
sekcji: wiki.debian.org/LSBInitScripts