ฉันมีความคิดสามประการเกี่ยวกับวิธีแก้ปัญหาที่เป็นไปได้สำหรับปัญหาของคุณ:
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
) ลงในสคริปต์เดียวเพราะดูเหมือนว่าจะตรงไปตรงมามากกว่าสำหรับฉัน แต่คุณอาจมีเหตุผลที่ดีในการทำเช่นนี้ และไม่มีเหตุผลที่จะไม่ทำงานหากทำอย่างถูกต้อง