Команда reboot -f
ніколи не повертається (якщо ви не мали дозволу на перезавантаження). У момент, коли він видається, клієнт SSH чекає, що можна зробити, що може бути:
- сервер SSH, який сповіщає клієнта про те, що сталося щось, що вимагає його уваги, наприклад, є якийсь вихід для відображення, або про те, що віддалена команда закінчена;
- якась подія на стороні клієнта, наприклад, сигнал для ретрансляції;
- таймер запускається, щоб клієнт надіслав повідомлення про збереження (і закрити з'єднання, якщо сервер не відповість).
Оскільки процес SSH-сервера мертвий, клієнт SSH не помре, поки таймер не запуститься.
Якщо ти біжиш ssh remotehost 'reboot -f >/dev/null &'
, то відбувається:
- Віддалена оболонка запускає
reboot
команду у фоновому режимі.
- Оскільки команда оболонки на стороні сервера завершена і не існує жодного процесу, утримуючи дескриптор файлу для стандартного виводу відкритим, сервер SSH закриває з'єднання.
reboot
Команда змушує машину перезавантаження.
Однак це не є надійним: залежно від часу, крок 3 може статися перед кроком 2. Додавання таймера робить це малоймовірним:
ssh remotehost '{ sleep 1; reboot -f; } >/dev/null &'
Щоб бути абсолютно впевненим, що сторона сервера зобов’язана працювати reboot
, переконуючись, що вона насправді не перезавантажується, перш ніж сповістити клієнта про її вчинення, вам потрібно додаткове повідомлення про перехід із сервера до клієнта. Це може бути виведено через з'єднання SSH, але воно ускладнюється.