man 5 crontab
jest całkiem jasne, jak używać crontab do uruchamiania skryptu podczas uruchamiania:
These special time specification "nicknames" are supported, which replace the 5 initial time and date
fields, and are prefixed by the `@` character:
@reboot : Run once after reboot.
Więc z radością dodałem jedną linię do mojego crontab (pod moim kontem użytkownika, a nie rootem):
@reboot /home/me/myscript.sh
Ale z jakiegoś powodu myscript.sh nie uruchomi się przy ponownym uruchomieniu komputera. (działa poprawnie, jeśli wywołam go z wiersza poleceń, więc nie jest to problem z uprawnieniami)
czego mi brakuje?
Zaktualizuj, aby odpowiedzieć na pytania @ Anthon:
- Wersja Oracle-Linux: 5.8 (uname: 2.6.32-300.39.2.el5uek # 1 SMP)
- Wersja Cron: vixie-cron-4.1-81.el5.x86_64
- Tak,
/home
jest zamontowaną partycją. Wygląda na to, że to jest problem. Jak to obejść? - Obecnie
myscript.sh
tylko echo wiadomości tekstowej do pliku w/home/me
.
/home
zamontowana partycja? Jaka jest twoja zawartość/home/me/myscript.sh
?@reboot
. oss.oracle.com/pipermail/el-errata/2012-March/002655.htmlmyscript.sh
wykonywalny?chmod +x myscript.sh
.Odpowiedzi:
Może to być nieco mylące, ponieważ istnieją różne implementacje crona. Było też kilka błędów, które zepsuły tę funkcję, i są też przypadki użycia, w których po prostu nie zadziała, szczególnie jeśli wykonasz zamknięcie / uruchomienie zamiast restartu.
Robaki
punkt danych 1
Omówiono tutaj jeden z takich błędów w Debianie, zatytułowany: cron: zadania @reboot nie są uruchamiane . Wydaje się, że dotarło to również do Ubuntu, czego nie mogę bezpośrednio potwierdzić.
punkt danych 2
Dowód błędu w Ubuntu wydaje się być potwierdzony tutaj w tym SO Q&A zatytułowanym: @reboot cronjob nie wykonuje się .
fragment
Przyjęta odpowiedź w tym pytaniu i odpowiedzi zawierała również ten komentarz:
Dodatkowe dowody
punkt danych nr 3
Dodatkowym dowodem był wątek, że ktoś próbował zrobić to samo i denerwował się, że to nie zadziałało. Nosi tytuł: Wątek: Cron - zadania @reboot nie działają .
fragment
Gdy ten powyżej użytkownik zorientował się, jaki jest jego problem, był w stanie zacząć
@reboot
pracę od wpisu crontab użytkownika.Nie jestem do końca pewien, jakiej wersji crona używa się na Ubuntu, ale wydaje się to wskazywać, że użytkownik może
@reboot
również użyć lub że błąd został naprawiony w pewnym momencie w kolejnych wersjach crona.punkt danych # 4
Testowałem na CentOS 6 następujące i działało.
Przykład
Następnie ponownie uruchomiłem system.
Po ponownym uruchomieniu.
Wynos
Aby dowiedzieć się więcej o tym, jak działa ten mechanizm,
@reboot
natknąłem się na tego posta na blogu, który omawia wnętrze. Nosi tytuł: @reboot - wyjaśnianie prostej magii cron .Debugowanie crond
Można zwiększyć poziom szczegółowości
crond
, dodając następujące elementy do tego pliku konfiguracyjnego w dystrybucjach opartych na RHEL / CentOS / Fedora.Prawidłowe poziomy to 0, 1 lub 2. Aby przywrócić ten plik do domyślnego poziomu rejestrowania, po prostu usuń po zakończeniu
"-L 2"
debugowania sytuację.źródło
@reboot
złożyłem to razem, co jest OK w niektórych cronach, a najwyraźniej jest wadliwe / uszkodzone w innych. Stąd zamieszanie.@reboot
działało, gdy zdałeś sobie sprawę, że próbuje uzyskać dostęp do zaszyfrowanego dysku, który nie został jeszcze zamontowany.@reboot sleep 60; <your command>
. Aby zacytować ten wątek, „zgaduję, że dyrektywa @ cron restartu crona działa zbyt wcześnie w procesie rozruchu”Dowiedziałem się, że na moim komputerze Ubuntu nie mam jeszcze dostępu do usług dns w czasie @reboot. To uniemożliwiło mi montaż zdalnych woluminów. To banalne, ale proste rozwiązanie zadziałało:
@reboot sleep 60 && /home/me/bin/mount.sh 2>&1 >> /home/me/reboot.log
(w root cron; ostatnie części tylko do debugowania)
źródło
Mam również Mac OSX i miałem ten sam problem, w którym mój skrypt nie był uruchomiony. ale kiedy poprawiłem skrypt
działało dla mnie dobrze. upewnij się, że plik powłoki jest wykonywalny, uruchamiając polecenie
źródło
Nie wiem, czy już to rozwiązałeś, czy też jedno z powyższych rozwiązań było potrzebne, ale inna możliwość to:
jeśli masz zaszyfrowany katalog / home, może on nie być dostępny, dopóki się nie zalogujesz, tzn. nie będzie dostępny przy ponownym uruchomieniu.
w tym scenariuszu możesz przenieść skrypty do innej lokalizacji, takiej jak / srv lub / opt lub / usr / local / bin / itp.
źródło
Weź świeżą instalację Ubuntu Gnome 13.10 (domyślny użytkownik w moim przypadku: avanderneut).
I zobacz, że po ponownym uruchomieniu plik
/var/tmp/xxx
istnieje, chociaż nie było go przed ponownym uruchomieniem.Dokonano tego z wersją 3.0 crona.
Musisz upewnić się, że nie są używane dyski z usługami itp., Które mogą być niedostępne w momencie uruchomienia skryptu. Zacznij od czegoś tak prostego jak powyższy i upewnij się, że nie ma on danych wyjściowych na terminalu, ponieważ prawdopodobnie e-mail nie działa.
Możesz także potrzebować bardziej aktualnego crona (lub aktualizacji z oracle-linux), jeśli to nie zadziałało i potrzebujesz tej funkcji.
źródło
/dev/mapper/VolGroup00-LogVol01
partycji, którą można zamontować .cron
. Powinieneś IMHO wybrać inną drogę niż crontab & @reboot, aby uruchomić coś raz podczas uruchamiania jako użytkownik.W przypadku pytania powiedziałbym „tak”. Miałem tylko problemy z uruchomieniem crona przy ponownym uruchomieniu (Debian 3.10.70) i udało mi się rozwiązać za pomocą:
@reboot root /usr/bin/python3 /path/to/script
I na końcu znak nowej linii „\ n”
To jest zawartość pliku:
Wreszcie uważam, że warto zauważyć streszczenie
man 5 crontab
źródło
prueba:
usuario @ ubuntu: ~ $ touch script.sh usuario @ ubuntu: ~ $ chmod + x script.sh
usuario @ ubuntu: ~ $ $ crontrab -e
@reboot /home/usuario/script.sh
zapisz i uruchom ponownie komputer
źródło