перезавантажте кілька машин віддалено


11

Мені потрібно перезавантажити ряд машин віддалено. Зазвичай я просто видаю

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

Але я хочу дати користувачам деякий час перед перезапуском. Однак сеанс ssh не відключиться, навіть якщо я використовую:

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

Я отримую повідомлення про помилку:

bash: -c: рядок 0: помилка синтаксису біля несподіваного ;' bash: -c: line 0:вимкнення sudo- маркера -r +5 &; відключення '

Будь-які пропозиції?


1
Додам, що я намагаюся надіслати команду вимкнення на задній план із знаком "&". Якщо оболонка інтерпретує "&" як розділювач команд, то я натрапляю на те, як надіслати його на задній план, щоб команда "відключилася" працювала.
Горацій

&Персонаж робить послати команду на лівій стороні в фоновому режимі. Ось чим він відрізняється ;.
kasperd

Відповіді:


31

Як зазначено в повідомленні про помилку, у вашій команді є синтаксична помилка. Це пов'язано з трохи дивовижним фактом, що &це не частина команди оболонки, а швидше роздільник між командами (як ;є). Хоча обидва є роздільниками команд &, це додатково впливає на команду з лівого боку. Це, звичайно, також мене іноді бентежить, і я часто роблю ту саму помилку. Як тільки ви це знаєте, це все-таки легко виправити.

Виправлення полягає в тому, щоб не писати, &;а просто написати один з двох роздільників залежно від вашого наміру. (І в більшості випадків, коли хтось писав, &;наміром було лише писати &).

Це має працювати:

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

7
Ви виграли сьогоднішню нагороду за те, що ви навчали мене чомусь, чого я не знав після 25 років удару в UNIX. Також +1!
MadHatter

Що робити, якщо він мав намір запустити sudo shutdown -r +5 &на задньому плані, а потім запустити disown? Як би Баш впорався з такою ситуацією? Я б очікував, що це ідеальний синтаксис для команди, навіть маючи &;. Якщо ;це роздільник команд, то у вас на руках 2 команди. Правильно?
Ісмаїл Мігель

1
@IsmaelMiguel Я не розумію вашого запитання. Використання &запустить першу команду у фоновому режимі, і як тільки перша команда буде запущена, друга команда буде запущена на передньому плані.
kasperd

Я мав на увазі, що sudo shutdown -r +5 &; disownце не здається поганим синтаксисом. Я маю на увазі, мій намір міг би виконати першу частину у фоновому режимі, а потім другу частину.
Ісмаїл Мігель

@IsmaelMiguel Аналізатор команд, ймовірно, може бути розширений, щоб вважати порожній рядок дійсною командою, яка завжди вдається. У цьому випадку sudo shutdown -r +5 &; disownвважаються три дійсні команди, розділені на &і ;. Однак це означає, що потрібно бути обережним, щоб не використовувати додатковий роздільник, якщо буде використаний існуючий статус попередньої команди. Це означає , що один повинен звернути увагу на tokenizing, а так як , наприклад , &&і & &отримує лексеми по- різному.
kasperd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.