Score:2

ฉันจะรีบูทโฮสต์ Linux เมื่อเครือข่ายล้มเหลวได้อย่างไร

ธง id

ฉันมีความเป็นส่วนตัว อูบุนตู โฮสต์เชื่อมต่อกับ Wi-Fi สาธารณะ/แชร์ เอ.พี (ไม่อยู่ภายใต้การควบคุมของฉัน).

บางครั้งอาจมีปัญหาเกี่ยวกับเครือข่าย และฉันมั่นใจมากว่าการเริ่มบริการเครือข่ายใหม่เท่านั้นจะไม่ทำงาน วิธีเดียวคือรีบูตเครื่อง

แผนของฉันคือเพิ่ม crontab เพื่อทดสอบการเชื่อมต่อเครือข่าย หากล้มเหลวให้รีบูตเครื่องคอมพิวเตอร์

ถ้าฉันเรียกใช้ auto_reboot.sh ด้วยตนเอง มันจะรีบูตเมื่อ a ปิง การทดสอบล้มเหลว แต่เรียกใช้จาก crontab มันไม่ทำงาน :)

นี่คือรายการ crontab ของฉัน

crontab -l
* * * * * /root/loadrc/transmissionrc/auto_reboot.sh

ไฟล์ /root/loadrc/transmissionrc/auto_reboot.sh

#!/bin/zsh

/root/loadrc/networkrc/ping.sh
อาร์ซี=$?

ถ้า [[ $rc -eq 0 ]]
แล้ว
    echo "บอกว่า Internet is back up"
อื่น
    รีบูต
ไฟ

ไฟล์ /root/loadrc/networkrc/ping.sh

#!/bin/zsh
((นับ = 10)) # จำนวนสูงสุดที่จะลอง

ในขณะที่ [[ $count -ne 0 ]] ; ทำ
    ping -c 1 8.8.8.8 # ลองสักครั้ง
    อาร์ซี=$?
    ถ้า [[ $rc -eq 0 ]] ; แล้ว
        ((count = 1)) # ถ้าโอเค ออกจากห่วงธง
    อื่น
        นอน 1 # ลดพายุเครือข่าย
    ไฟ
    ((count = นับ - 1)) #งั้นเราไปกันไม่รอดหรอก
เสร็จแล้ว

ออกจาก $rc

ฉันเพิ่มบันทึกและจงใจลดอินเทอร์เฟซ Wi-Fi:

ดู ifconfig wlan0 ลง
Transmissionrc/auto_reboot.sh
#!/bin/zsh

เสียงสะท้อน "" > /root/loadrc/crontab.log

/root/loadrc/networkrc/ping.sh
อาร์ซี=$?

ถ้า [[ $rc -eq 0 ]]
แล้ว
    echo "บอกว่า Internet is back up"
อื่น
    รีบูต
ไฟ
networkrc/ping.sh
#!/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
    อาร์ซี=$?

    ถ้า [[ $rc -eq 0 ]] ; แล้ว
        echo "ขั้นตอน --> 3" >> /root/loadrc/crontab.log
        ((count = 1)) # ถ้าโอเค ออกจากห่วงธง
    อื่น
        echo "ขั้นตอน --> 4" >> /root/loadrc/crontab.log
        นอน 1 # ลดพายุเครือข่าย
    ไฟ
    ((count = นับ - 1)) #งั้นเราไปกันไม่รอดหรอก
เสร็จแล้ว

ออกจาก $rc

ไฟล์ /root/loadrc/crontab.log

/usr/bin/ping: เชื่อมต่อ: ไม่สามารถเข้าถึงเครือข่ายได้
ขั้นตอน --> 2
ขั้นตอน --> 3

ซึ่งหมายความว่า ในโหมด crontab แม้การทดสอบ ping จะล้มเหลว โค้ดส่งคืนก็ยังเป็นศูนย์

ดังนั้นคำถามจึงมาถึง: ฉันจะทดสอบการเชื่อมต่อเครือข่ายในโหมด crontab ได้อย่างไร

djdomi avatar
za flag
ดูเหมือนว่าปัญหา x และ y ปัญหาดั้งเดิมที่คุณพยายามแก้ไขคืออะไร
sn flag
Re *"โฮสต์ Ubuntu ส่วนบุคคล"*: นั่นจะไม่ทำให้นอกหัวข้อใช่ไหม
br flag
ฉันจะไม่ใช้ `cron` สำหรับสิ่งนั้น แต่ใช้ `watchdog` ซึ่งออกแบบมาโดยเฉพาะเพื่อรีบูตเครื่องในระบบหากเงื่อนไขบางอย่างล้มเหลว และอนุญาตให้เรียกใช้คำสั่งที่กำหนดเองเป็นการตรวจสอบ
Score:7
ธง cn
Bob
/usr/bin/ping -c 1 8.8.8.8 >> /root/loadrc/crontab.log 2>&1 
echo "ขั้นตอน --> 2" >> /root/loadrc/crontab.log  
อาร์ซี=$?

ฉันคิดว่านี่เป็นการตรวจสอบรหัสทางออกของ เสียงสะท้อน คำสั่งในขณะที่ตรรกะของคุณต้องการรหัสทางออกของ ปิง สั่งการ.

huangyingw avatar
id flag
ใช่ มีข้อบกพร่องในเสียงสะท้อนของฉัน ขอบคุณที่ชี้ให้เห็น
marcelm avatar
ng flag
@huangyingw คุณช่วยอัปเดตคำถามของคุณเพื่อแก้ไขได้ไหม
Score:2
ธง il

ฉันมีความคิดสามประการเกี่ยวกับวิธีแก้ปัญหาที่เป็นไปได้สำหรับปัญหาของคุณ:

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

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

huangyingw avatar
id flag
ขอบคุณสำหรับคำตอบ ใช่ ฉันพบสาเหตุ ฉันต้องใช้เส้นทางแบบเต็มของคำสั่งรีบูต ฉันแยกตรรกะเป็น ping.sh เพื่อนำมาใช้ซ้ำได้ดีขึ้น บางทีสคริปต์อื่นของฉันอาจต้องการมัน มันเป็นลินุกซ์หัวขาดส่วนบุคคลของฉันเพื่อความสนุก ดังนั้นฉันจึงเข้าสู่ระบบในฐานะรูทเสมอ cron และสคริปต์ทั้งหมดทำงานในฐานะรูท หนึ่งคำถามติดตามผล: หากฉัน (รูท) ไม่ได้เข้าสู่ระบบ root cron จะทำงานของมันหรือไม่ สิ่งที่ฉันต้องการคือ cron แม้ว่าจะไม่มีผู้ใช้ (รวมถึงรูท) เข้าสู่ระบบ แต่ก็ยังทำงานเป็นประจำและตรวจสอบสถานะเครือข่ายและรีบูตหากจำเป็น @seamus
Seamus avatar
il flag
@huangyingw: *"`หนึ่งคำถามติดตามผล: หากฉัน (รูท) ไม่ได้เข้าสู่ระบบ root cron จะทำงานของมันหรือไม่ `"* ใช่ - `cron` คือ *daemon* ที่ทำงานอยู่เบื้องหลังโดยที่ผู้ใช้ไม่ต้องดำเนินการใดๆ ที่จำเป็น; จุดประสงค์เพียงอย่างเดียวคือการเรียกใช้งานแม้ว่าผู้ใช้จะไม่ได้เข้าสู่ระบบก็ตาม
huangyingw avatar
id flag
ดีใจที่ได้ยิน ขอบคุณ @seamus
Seamus avatar
il flag
@huangyingw: ยินดีต้อนรับ และอย่าลืม[โหวตคำตอบที่ *มีประโยชน์* และ *เลือก* คำตอบ](https://serverfault.com/help/someone-answers) ตามความเหมาะสม .

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา