Am trei gânduri despre soluțiile posibile la problema ta:
1. Ai spus:
Dacă rulez manual auto_reboot.sh, acesta se repornește atunci când un test ping eșuează. Dar rulând din crontab, nu funcționează:)
De obicei, atunci când o comandă rulează corect în shell-ul tău interactiv (din CLI), dar nu rulează corect sub cron
se datorează unei diferențe în mediu inconjurator; de exemplu. cron
are o cale diferită de cea a dvs. din shell-ul dvs. interactiv. De obicei, cel cron
mediul este: PATH=/usr/bin:/bin
. Orice scenariu alergi fugi sub cron
nu va putea găsi executabile care nu sunt pe PATH.
Deoparte, puteți verifica cron
mediu pe sistemul dvs. pur și simplu rulând înv
folosind dvs crontab
:
* * * * * /usr/bin/env > /my/cronlog/location/mycronenvironment.txt 2>&1
În dumneavoastră auto_reboot.sh
, nu ați reușit să utilizați a specificații complete ale traseului pentru reporniți
. La fel de reporniți
se găsește de obicei în /sbin/reboot
, și /sbin
S-ar putea să nu fie în PATH folosit de cron
, aceasta este o problemă potențială.
prin urmare, vă sugerez să verificați mediul (PATH) utilizat de cron
, și verificați de două ori că toate comenzile dvs. sunt fie: 1) pe cron
PATH, sau 2) utilizați a specificația completă a căii.
2. Epuizezi totul din /rădăcină
director
De obicei, /rădăcină
nu este folosit pentru utilizator scenarii. Poate că folosești sudo
? Sau, poate ai făcut un su
a deveni root? Dacă acesta este cazul, aș face-o cometariu că asta nu este cea mai buna practica, chiar dacă încă poate funcționa. simt cea mai buna practica este de a folosi sudo
de la tine utilizator cont pentru orice escaladare a privilegiilor de care aveți nevoie.
Fără să încerc să fiu pedant, aș vrea să spun că rădăcină
contul are un crontab
care rulează independent de oricare utilizator crontab
. De asemenea rădăcină crontab
nu necesita sudo
fi folosit - tot ce se face în rădăcină crontab
se termina cu rădăcină
privilegii.
Toate acestea spuse, văd apelul la reporniți
în scriptul tău - o comandă care cere privilegii root pentru a rula. Aceasta va funcționa așa cum ați scris-o numai atunci când este utilizat în rădăcină crontab
. Întrebarea dvs. nu a indicat dacă utilizați sau nu su
sau sudo
, și așa am trecut prin asta într-un efort de a clarifica două puncte:
- Dacă ale tale
cron
jobul cere rădăcină
privilegii, ea pot fi cel mai bine să rulezi acel job de la rădăcină crontab
. Alternativa este utilizarea sudo
într-o utilizatorul crontab
ceea ce este potențial incomod dacă este necesară autentificarea pentru sudo
- așa cum se întâmplă adesea.
- The
rădăcină crontab
poate fi accesat dintr-un cont de utilizator obișnuit prin simpla utilizare sudo crontab -e
; adică nu este obligat să o facă su
la rădăcină
pentru a accesa rădăcină crontab
.
3. Este posibil să aveți o eroare logică în scriptul dvs
După cum se subliniază în alt raspuns, nu este clar că te poți baza pe valoarea de rc
de la tine ping.sh
scenariul ca o condiție pentru reporniți
. Din păcate, dacă aceasta este sau nu o problemă este mascată de ceea ce par a fi două versiuni diferite ale ping.sh
scriptul din întrebarea dvs. - nu este clar dacă utilizați prima versiune:
#!/bin/zsh
((număr = 10)) # Număr maxim de încercat.
în timp ce [[ $count -ne 0 ]] ; do
ping -c 1 8.8.8.8 # Încercați o dată.
rc=$?
sau a doua versiune:
#!/bin/zsh
((număr = 10)) # Număr maxim de încercat.
în timp ce [[ $count -ne 0 ]] ; do
/usr/bin/ping -c 1 8.8.8.8 >> /root/loadrc/crontab.log 2>&1
echo "pasul --> 2" >> /root/loadrc/crontab.log
rc=$?
Strict ca alegere personală, aș prefera combinarea codului din aceste două scripturi (ping.sh
și auto_reboot.sh
) într-un singur script, deoarece mi se pare mai simplu, dar este posibil să aveți motive întemeiate să o faceți în acest fel și nu există niciun motiv că nu va funcționa dacă este făcută corect.