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