reboot beberapa mesin dari jarak jauh

11

Saya perlu mem-boot ulang sejumlah mesin dari jarak jauh. Biasanya saya hanya mengeluarkan

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

Tapi saya ingin memberi pengguna waktu sebelum restart. Namun mereka ssh sesi tidak akan terputus bahkan jika saya menggunakan:

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

Saya mendapat pesan kesalahan:

bash: -c: line 0: kesalahan sintaksis dekat token ;' bash: -c: line 0:sudo shutdown tak terduga -r +5 &; disown '

Ada saran?

Horace
sumber
1
Saya harus menambahkan bahwa saya mencoba mengirim perintah penutupan ke latar belakang dengan "&". Jika shell menafsirkan "&" sebagai pemisah perintah maka saya bingung bagaimana cara mengirimnya ke latar belakang sehingga perintah "disown" bekerja.
Horace
The &karakter tidak mengirim perintah di sisi kiri di latar belakang. Begitulah bedanya ;.
kasperd

Jawaban:

31

Seperti yang dinyatakan oleh pesan kesalahan, Anda memiliki kesalahan sintaksis dalam perintah Anda. Hal ini disebabkan oleh fakta yang sedikit mengejutkan yang &bukan merupakan bagian dari perintah shell melainkan pemisah antara perintah (seperti ;). Padahal keduanya adalah pemisah perintah yang &memiliki efek tambahan pada perintah di sisi kirinya. Ini tentu juga kadang membingungkan saya, dan saya sering membuat kesalahan yang sama. Setelah Anda mengetahuinya, cara ini mudah diperbaiki.

Cara mengatasinya adalah tidak menulis &;tetapi hanya menulis salah satu dari dua pemisah tergantung pada niat Anda. (Dan dalam kebanyakan kasus di mana seseorang telah menulis &;niatnya adalah hanya menulis &).

Ini seharusnya bekerja:

ssh server 'sudo shutdown -r +5 & disown'
kasperd
sumber
7
Anda memenangkan hadiah hari ini karena mengajari saya sesuatu yang tidak saya ketahui setelah 25 tahun melakukan bashing di UNIX. Juga memberi +1!
MadHatter
Bagaimana jika dia berniat untuk berjalan sudo shutdown -r +5 &di latar belakang dan kemudian berlari disown? Bagaimana bash akan menangani situasi seperti itu? Saya berharap ini menjadi sintaks yang sempurna untuk sebuah perintah, bahkan memiliki &;. Jika ;pemisah perintah, maka Anda memiliki 2 perintah di tangan Anda. Baik?
Ismael Miguel
1
@ IsmaelMiguel Saya tidak mendapatkan pertanyaan Anda. Menggunakan &akan memulai perintah pertama di latar belakang dan setelah perintah pertama dimulai, perintah kedua akan dijalankan di latar depan.
kasperd
Maksud saya itu sudo shutdown -r +5 &; disowntidak tampak seperti sintaks yang buruk. Maksud saya, maksud saya bisa menjalankan bagian pertama di latar belakang dan kemudian bagian 2.
Ismael Miguel
@IsmaelMiguel Command parser mungkin dapat diperluas untuk mempertimbangkan string kosong sebagai perintah yang valid yang selalu berhasil. Dalam hal sudo shutdown -r +5 &; disownitu akan dianggap sebagai tiga perintah yang valid dipisahkan oleh &dan ;. Namun itu berarti bahwa seseorang harus berhati-hati untuk tidak menggunakan pemisah tambahan jika status yang ada dari perintah sebelumnya akan digunakan. Itu berarti bahwa seseorang harus memperhatikan tokenizing juga karena misalnya &&dan & &mendapat tokenized berbeda.
kasperd