birden fazla makineyi uzaktan yeniden başlat


11

Birkaç makineyi uzaktan yeniden başlatmam gerekiyor. Normalde sadece veriyorum

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

Ancak yeniden başlatmadan önce kullanıcılara biraz zaman vermek istiyorum. Ancak ben bile ssh oturum bağlantı kesilmez:

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

Bir hata mesajı alıyorum:

bash: -c: line 0: beklenmeyen simge yakınında sözdizimi hatası ;' bash: -c: line 0:sudo shutdown -r +5 &; disown '

Herhangi bir öneri?


1
Kapatma komutunu "&" ile arka plana göndermeye çalıştığımı eklemeliyim. Kabuk "&" komut ayırıcısı olarak yorumlanıyorsa, "disown" komutunun çalışması için arka plana nasıl gönderileceği konusunda güdük oldum.
Horace

&Karakter arka planda sol tarafta komutu gönderiyor. Bundan farklı ;.
kasperd

Yanıtlar:


31

Hata mesajında ​​belirtildiği gibi, komutunuzda bir sözdizimi hatası var. &Kabuk komutunun bir parçası değil, komutlar arasında bir ayırıcı (olduğu gibi ;) biraz şaşırtıcı bir gerçek . Her ikisi de komut ayırıcılarının &sol taraftaki komut üzerinde ek bir etkisi vardır. Bu kesinlikle beni bazen karıştırıyor ve sık sık aynı hatayı yapıyorum. Bir kez öğrendikten sonra, düzeltmek kolaydır.

Çözüm &;, niyetinize göre yazmak değil, iki ayırıcıdan birini yazmaktır. (Ve kişinin yazdığı çoğu durumda &;niyet sadece yazmaktı &).

Bu çalışmalı:

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

7
UNIX'e 25 yıllık dayaktan sonra bilmediğim bir şeyi öğretmek için bugünün ödülünü kazanıyorsun. Ayrıca +1!
MadHatter

Ya sudo shutdown -r +5 &arka planda koşup sonra koşmayı planladıysa disown? Bash bu durumu nasıl ele alır? Ben bile, bir komut için mükemmel sözdizimi olmasını beklerdim &;. Eğer ;bir komut ayırıcı, sonra elinizde 2 komutları var. Sağ?
Ismael Miguel

1
@IsmaelMiguel Sorunuzu anlamıyorum. Kullanıldığında &arka planda ilk komut başlatılır ve ilk komut başlatıldığında ikinci komut ön planda çalıştırılır.
kasperd

Demek istediğim bu sudo shutdown -r +5 &; disownkötü bir sözdizimi gibi görünmüyor. Demek istediğim, ilk kısmı arka planda, sonra da 2. kısmı çalıştırmak olabilir.
Ismael Miguel

@IsmaelMiguel Komut ayrıştırıcısı, boş dizeyi her zaman başarılı olan geçerli bir komut olarak değerlendirmek için genişletilebilir. Bu durumda ve ile sudo shutdown -r +5 &; disownayrılmış üç geçerli komut olarak kabul edilir . Bununla birlikte, önceki komutun mevcut durumu kullanılacaksa, ek bir ayırıcı kullanılmamasına dikkat edilmesi gerektiği anlamına gelir. Bu, örneğin tokenleştirmeye de dikkat etmek zorunda olduğu anlamına gelir ve örneğin farklı şekilde tokenize edilir. &;&&& &
kasperd
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.