ฉันมีความคิดสามประการเกี่ยวกับวิธีแก้ปัญหาที่เป็นไปได้สำหรับปัญหาของคุณ:
1. คุณพูดว่า:
ถ้าฉันเรียกใช้ auto_reboot.sh ด้วยตนเอง มันจะรีบูตเมื่อการทดสอบ ping ล้มเหลว แต่เรียกใช้จาก crontab มันไม่ทำงาน :)
โดยปกติแล้ว เมื่อคำสั่งทำงานอย่างถูกต้องในเชลล์แบบโต้ตอบของคุณ (จาก CLI) แต่ทำงานไม่ถูกต้องภายใต้ ครอน มันเป็นเพราะความแตกต่างใน สิ่งแวดล้อม; เช่น. ครอน มี PATH ที่แตกต่างจากที่คุณทำจากเชลล์แบบโต้ตอบ โดยทั่วไป, ครอน สภาพแวดล้อมคือ: PATH=/usr/bin:/bin. สคริปต์ใด ๆ คุณวิ่งภายใต้ ครอน จะไม่สามารถค้นหาไฟล์เรียกทำงานที่ไม่ได้อยู่ใน PATH ได้
นอกจากนี้ คุณสามารถตรวจสอบ ครอน สภาพแวดล้อมในระบบของคุณเพียงแค่เรียกใช้ สิ่งแวดล้อม ใช้ของคุณ crontab:
* * * * * /usr/bin/env > /my/cronlog/location/mycronenvironment.txt 2>&1
ในของคุณ auto_reboot.shคุณล้มเหลวในการใช้ ข้อกำหนดเส้นทางแบบเต็ม สำหรับ รีบูต. เนื่องจาก รีบูต มักพบใน /sbin/รีบูต, และ /sbin อาจจะไม่ ในเส้นทางที่ใช้โดย ครอนนี่เป็นปัญหาที่อาจเกิดขึ้น
เพราะเหตุนี้ฉันจะแนะนำให้คุณตรวจสอบสภาพแวดล้อม (PATH) ที่ใช้โดย ครอนและตรวจสอบอีกครั้งว่าคำสั่งทั้งหมดของคุณคือ: 1) บน ครอน PATH หรือ 2) ใช้ a ข้อกำหนดเส้นทางแบบเต็ม.
2. คุณใช้ทุกอย่างให้หมดไปจาก /ราก ไดเรกทอรี
ปกติ, /ราก ไม่ได้ใช้สำหรับ ผู้ใช้ สคริปต์ บางทีคุณกำลังใช้ ซูโด? หรือบางทีคุณอาจทำ สุ จะกลายเป็นราก? หากเป็นกรณีนี้ฉันจะ ความคิดเห็น ว่านี่ไม่ใช่ ปฏิบัติที่ดีที่สุดแม้ว่าจะยังคงสามารถทำงานได้ ฉันรู้สึก ปฏิบัติที่ดีที่สุด คือการใช้ ซูโด จากคุณ ผู้ใช้ บัญชีสำหรับการยกระดับสิทธิ์ใด ๆ ที่คุณต้องการ
ฉันอยากจะบอกว่า ราก บัญชีมี crontab ที่ทำงานอย่างเป็นอิสระจากสิ่งใดๆ ผู้ใช้ crontab. อีกทั้ง crontab ราก ไม่ต้องการ ซูโด ถูกนำมาใช้ - ทุกอย่างที่ทำใน crontab ราก เสร็จแล้วด้วย ราก สิทธิพิเศษ
ที่พูดมาทั้งหมดผมเห็นโทรไปที่ รีบูต ในสคริปต์ของคุณ - คำสั่งที่ ต้องใช้ สิทธิ์ใช้งานรูทเพื่อเรียกใช้ สิ่งนี้จะทำงานตามที่คุณเขียน เท่านั้น เมื่อใช้งานใน crontab ราก. คำถามของคุณไม่ได้ระบุว่าคุณกำลังใช้อยู่หรือไม่ สุ หรือ ซูโดดังนั้นฉันจึงทำสิ่งนี้โดยพยายามทำให้ชัดเจนสองประเด็น:
- ถ้าคุณ
ครอน งานต้องการ ราก สิทธิพิเศษมัน อาจจะ ดีที่สุดในการเรียกใช้งานนั้นจาก crontab ราก. ทางเลือกคือการใช้ ซูโด ใน crontab ผู้ใช้ ซึ่งอาจเป็นเรื่องที่น่าอึดอัดใจหากจำเป็นต้องมีการตรวจสอบสิทธิ์ ซูโด - มักจะเป็นเช่นนั้น
- เดอะ
crontab ราก อาจเข้าถึงได้จากบัญชีผู้ใช้ทั่วไปเพียงแค่ใช้ sudo crontab -e; นั่นคือไม่จำเป็นต้องทำ สุ ถึง ราก เพื่อเข้าถึง crontab ราก.
3. คุณอาจมีข้อผิดพลาดเชิงตรรกะในสคริปต์ของคุณ
ตามที่แจ้งไว้ใน คำตอบอื่นมันไม่ชัดเจนว่าคุณสามารถพึ่งพาค่าของ อาร์ จากคุณ ping.sh สคริปต์เป็นเงื่อนไขสำหรับ รีบูต. น่าเสียดายที่ปัญหานี้ถูกปกปิดโดยสิ่งที่ดูเหมือนจะเป็นสองเวอร์ชันที่แตกต่างกันของ ping.sh สคริปต์ในคำถามของคุณ - ไม่ชัดเจนว่าคุณกำลังใช้เวอร์ชันแรกอยู่หรือไม่:
#!/bin/zsh
((นับ = 10)) # จำนวนสูงสุดที่จะลอง
ในขณะที่ [[ $count -ne 0 ]] ; ทำ
ping -c 1 8.8.8.8 # ลองสักครั้ง
อาร์ซี=$?
หรือรุ่นที่สอง:
#!/bin/zsh
((นับ = 10)) # จำนวนสูงสุดที่จะลอง
ในขณะที่ [[ $count -ne 0 ]] ; ทำ
/usr/bin/ping -c 1 8.8.8.8 >> /root/loadrc/crontab.log 2>&1
echo "ขั้นตอน --> 2" >> /root/loadrc/crontab.log
อาร์ซี=$?
ตามตัวเลือกส่วนตัวของฉันอย่างเคร่งครัด ฉันต้องการรวมโค้ดจากสคริปต์ทั้งสองนี้ (ping.sh และ auto_reboot.sh) ลงในสคริปต์เดียวเพราะดูเหมือนว่าจะตรงไปตรงมามากกว่าสำหรับฉัน แต่คุณอาจมีเหตุผลที่ดีในการทำเช่นนี้ และไม่มีเหตุผลที่จะไม่ทำงานหากทำอย่างถูกต้อง