czynność1
while [warunek ] ;; do
n x czynność2
done
czynność3
Jej pełne wykonanie zajmuje ok 23 dni. Nie mogę mieć tak długo włączonego komputera a gdy zabije po prostu skrypt bez wykonywania czynności3 to tworzą się pewne komplikację. Czy jest możliwość, aby skrypt po odebraniu sygnału o wyłączaniu komputera albo wydaniu polecenia:
Dla takiego czegoś nic za bardzo nie zadziała. Sygnał zabijający nie może być przechwycony przez żaden proces w systemie. Dlaczego kończysz proces w ten sposób? Zabicie sygnału to powinna być ostateczność. Powinieneś używać po prostu:
To już chyba z przyzwyczajenia. Po prostu ktoś mi pierwszy raz pokazał, ze należy wstawić tam dziewiątkę i tak robiłem. Równie dobrze mogę traktować zwykłym poleceniem zabicia procesu i nauczyć skrypt reagować na SIGTERM. Tylko czy to zadziała gdy root wyda polecenie restartu systemu bądź ktoś wciśnie wyłącznik na obudowie?
Zadziała, system podczas wyłączania wysyła do procesów sygnał TERM - chyba, że proces nie reaguje przez dłuższą chwile to wysyła SIGKILL dlatego procedura obsługi sygnału TERM musi być szybka (zapisanie danych i wyjście). Nie wiem jakie akcje wykonujesz w tej czynnosc2, ale pamiętaj, że podczas gdy twoja procedura będzie wykonywana w systemie może już nie istnieć dużo usług, ponieważ będą już zatrzymane przez system.
Najlepszym rozwiązaniem jest napisanie skryptu, który będzie wykonywany na samym początku podczas zamykania systemu, który będzie wysyłał odpowiedni sygnał do twojego procesu.
Bastian pisze:kudlat9, w porządku, ale co w przypadku twardego resetu?
To pytanie jest bezsensu, jak system ma poprawnie pozamykać procesy skoro znienacka odetniesz mu prąd? Dla takich przypadków jednym ratunkiem jest napisanie oprogramowania tak, aby był w stanie wznowić operacje po nieoczekiwanych restartach (np. wykorzystując mechanizmy transakcji).
Zapoznałem się już z funkcją trap jednak ze wprowadzenia zmian w skrypcie zrezygnowałem. Bastian źle mnie zrozumiał. Oczywiście chodziło mi o wciśnięcie przycisku "miękkiego wyłączania" bo jak każdy zdaje sobie sprawę, ze przed gwałtownym odcięciem zasilania nic mnie nie uchroni. Poprawne wyjście ze skryptu wymaga działającego połączenia internetowego i zajmuje ok. minuty.
Ewentualnie, skrypt mógłby po włączeniu komputera sprawdzać, czy czynność 3 została wykonana w ostatnim cyklu i jeśli nie, to zacząć swoją pracę od jej wykonania, a dopiero potem wchodziłby w pętlę.