zrestartuj wiele komputerów zdalnie

11

Muszę zdalnie zrestartować kilka komputerów. Zwykle po prostu wydaje

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

Ale chcę dać użytkownikom trochę czasu przed ponownym uruchomieniem. Jednak sesja ssh nie rozłączy się, nawet jeśli użyję:

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

Otrzymuję komunikat o błędzie:

bash: -c: linia 0: błąd składni w pobliżu nieoczekiwanego tokena ;' bash: -c: line 0:zamknięcie sudo -r +5 &; disown '

Jakieś sugestie?

Horacy
źródło
1
Powinienem dodać, że próbuję wysłać polecenie zamknięcia do tła za pomocą „&”. Jeśli powłoka interpretuje „&” jako separator poleceń, to jestem zaskoczony, jak wysłać ją do tła, aby działało polecenie „disown”.
Horace,
&Postać robi wysłać polecenie na lewej stronie w tle. Tak to się różni ;.
kasperd

Odpowiedzi:

31

Jak stwierdzono w komunikacie o błędzie, w poleceniu występuje błąd składniowy. Wynika to z nieco zaskakującego faktu, że &nie jest on częścią polecenia powłoki, ale raczej separatorem między poleceniami (tak jak ;jest). Chociaż oba są separatorami poleceń, &mają dodatkowy wpływ na polecenie po lewej stronie. Z pewnością to też mnie czasami myli i często popełniam ten sam błąd. Gdy się zorientujesz, można go jednak łatwo naprawić.

Rozwiązaniem jest nie pisać, &;a po prostu napisać jeden z dwóch separatorów w zależności od intencji. (I w większości przypadków, gdy ktoś napisał, &;intencją było tylko pisanie &).

To powinno działać:

ssh server 'sudo shutdown -r +5 & disown'
kasperd
źródło
7
Zdobyłeś dzisiejszą nagrodę za nauczenie mnie czegoś, o czym nie wiedziałem po 25 latach bicia w UNIX. Również +1!
MadHatter
Co jeśli zamierzał uruchomić sudo shutdown -r +5 &w tle, a następnie uruchomić disown? Jak bash poradziłby sobie z taką sytuacją? Spodziewałbym się, że będzie to idealna składnia polecenia, nawet jeśli &;. Jeśli ;jest separatorem poleceń, masz na ręce 2 polecenia. Dobrze?
Ismael Miguel
1
@ IsmaelMiguel Nie dostaję twojego pytania. Użycie &spowoduje uruchomienie pierwszego polecenia w tle, a po uruchomieniu pierwszego polecenia drugie polecenie zostanie uruchomione na pierwszym planie.
kasperd
Miałem na myśli, że sudo shutdown -r +5 &; disownnie wygląda to na złą składnię. Mam na myśli, że moją intencją może być uruchomienie pierwszej części w tle, a następnie drugiej części.
Ismael Miguel
@ IsmaelMiguel Analizator składni komend można prawdopodobnie rozszerzyć, aby uznać pusty ciąg za prawidłowe polecenie, które zawsze się powiedzie. W takim przypadku sudo shutdown -r +5 &; disownzostaną uznane za trzy prawidłowe polecenia oddzielone przez &i ;. Oznaczałoby to jednak, że należy zachować ostrożność, aby nie używać dodatkowego separatora, jeśli ma zostać użyty status poprzedniego polecenia. To nie znaczy, że trzeba zwrócić uwagę na tokenizing także od na przykład &&i & &dostaje tokenized inaczej.
kasperd