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.