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?
&
Postać robi wysłać polecenie na lewej stronie w tle. Tak to się różni;
.Odpowiedzi:
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ć:
źródło
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?&
spowoduje uruchomienie pierwszego polecenia w tle, a po uruchomieniu pierwszego polecenia drugie polecenie zostanie uruchomione na pierwszym planie.sudo shutdown -r +5 &; disown
nie 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.sudo shutdown -r +5 &; disown
zostaną 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.