รีบูตเครื่องหลายเครื่องจากระยะไกล


11

ฉันต้องรีบูตเครื่องหลายเครื่องจากระยะไกล โดยปกติฉันเพิ่งออก

for host in <hostlist>;do ssh ${host} 'sudo shutdown -r now';done

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

ssh -f 'sudo shutdown -r +5 &;disown'

ฉันได้รับข้อความแสดงข้อผิดพลาด:

bash: -c: บรรทัด 0: เกิดข้อผิดพลาดทางไวยากรณ์ใกล้กับการ;' bash: -c: line 0:ปิดโทเค็นโทเค็นที่ไม่คาดคิด-r +5 &; disown '

ข้อเสนอแนะใด ๆ


1
ฉันควรเพิ่มว่าฉันกำลังพยายามส่งคำสั่งปิดเครื่องไปยังพื้นหลังด้วย "&" หากเชลล์ตีความ "&" เป็นตัวคั่นคำสั่งฉันก็จะนิ่งงันว่าจะส่งไปยังพื้นหลังอย่างไรเพื่อให้คำสั่ง "ปฏิเสธ" ทำงาน
ฮอเรซ

&ตัวอักษรไม่ส่งคำสั่งบนด้านซ้ายมือในพื้นหลัง ;นั่นเป็นวิธีที่มันแตกต่างจาก
kasperd

คำตอบ:


31

ตามที่ระบุไว้โดยข้อความแสดงข้อผิดพลาดคุณมีข้อผิดพลาดทางไวยากรณ์ในคำสั่งของคุณ มันเป็นเพราะข้อเท็จจริงที่น่าประหลาดใจเล็กน้อยที่&ไม่ได้เป็นส่วนหนึ่งของคำสั่งเชลล์ แต่เป็นตัวคั่นระหว่างคำสั่ง (เหมือน;) แม้ว่าตัวคั่นคำสั่งทั้งคู่จะ&มีผลเพิ่มเติมกับคำสั่งทางด้านซ้ายมือ เรื่องนี้ทำให้ฉันสับสนในบางครั้งและฉันก็ทำผิดพลาดเหมือนกัน เมื่อคุณรู้แล้วมันเป็นเรื่องง่ายที่จะแก้ไข

การแก้ไขคือการไม่เขียน&;แต่เพียงเขียนตัวคั่นหนึ่งในสองตัวตามความต้องการของคุณ (และในกรณีส่วนใหญ่ที่มีการเขียน&;ความตั้งใจที่จะเขียนเท่านั้น&)

สิ่งนี้น่าจะใช้ได้:

ssh server 'sudo shutdown -r +5 & disown'

7
คุณได้รับรางวัลในวันนี้จากการสอนฉันบางอย่างที่ฉันไม่รู้หลังจาก 25 ปีของการทุบตีระบบ UNIX +1 ด้วย!
MadHatter

ถ้าเขาตั้งใจจะวิ่งsudo shutdown -r +5 &บนพื้นหลังแล้ววิ่งdisownล่ะ ทุบตีจะจัดการกับสถานการณ์ดังกล่าวได้อย่างไร ฉันจะคาดหวังนี้จะสมบูรณ์แบบ&;ไวยากรณ์สำหรับคำสั่งไม่ต้องมี หาก;เป็นตัวคั่นคำสั่งคุณจะมี 2 คำสั่งอยู่ในมือ ขวา?
Ismael Miguel

1
@IsmaelMiguel ฉันไม่ได้รับคำถามของคุณ การใช้&จะเริ่มคำสั่งแรกในพื้นหลังและเมื่อคำสั่งแรกเริ่มต้นแล้วคำสั่งที่สองจะทำงานในเบื้องหน้า
kasperd

ฉันหมายถึงว่าsudo shutdown -r +5 &; disownมันดูเหมือนไวยากรณ์ที่ไม่ดี ฉันหมายถึงความตั้งใจของฉันอาจจะทำงานส่วนแรกในพื้นหลังและส่วนที่ 2
Ismael Miguel

@IsmaelMiguel ตัวแยกวิเคราะห์คำสั่งอาจถูกขยายเพื่อพิจารณาสตริงว่างเปล่าเป็นคำสั่งที่ถูกต้องซึ่งจะประสบความสำเร็จเสมอ ในกรณีที่ว่าsudo shutdown -r +5 &; disownจะได้รับการพิจารณาให้เป็นสามคำสั่งที่ถูกต้องคั่นด้วยและ& ;อย่างไรก็ตามมันหมายความว่าต้องระวังไม่ให้ใช้ตัวคั่นเพิ่มเติมหากสถานะที่มีอยู่ของคำสั่งก่อนหน้านี้จะถูกใช้ มันไม่ได้หมายความว่าหนึ่งจะต้องใส่ใจกับ tokenizing เช่นกันตั้งแต่ตัวอย่าง&&และ& &ได้รับ tokenized ที่แตกต่างกัน
kasperd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.