Для эффективного выполнения задач вам может понадобиться выполнять удаленные команды на сервере по SSH, одновременно запуская другие процессы на локальной машине. Хотя команда 'nohup' и добавление & к команде позволяют запускать фоновые процессы локально, эти методы не работают так, как ожидается, для удаленных SSH-команд.
Проблема заключается в том, что даже если команда выполняется в фоновом режиме на удаленном сервере, она продолжает блокировать SSH-сессию, освобождая ее только по завершении выполнения команды. Такое поведение проблематично для автоматических сценариев, которые требуют активного соединения, но не могут выполнить команду в фоновом режиме.
Чтобы выполнить удаленную команду SSH в фоновом режиме без этого ограничения, выполните следующие действия:
- Запретите SSH блокировать ввод, перенаправив вывод в /dev/null.
- Переведите сеанс клиента SSH в фоновый режим.
Эти задачи можно решить с помощью опций -n и -f в SSH-клиенте.
- -n - Перенаправляет stdin из /dev/null (фактически, предотвращает чтение из stdin). Это необходимо использовать, когда ssh работает в фоновом режиме. Обычный трюк заключается в том, чтобы использовать его для запуска X11-программ на удаленной машине. Например, ssh -n shadows.cs.hut.fi emacs & запустит anemacs на shadows.cs.hut.fi, а X11-соединение будет автоматически передано по зашифрованному каналу. Программа ssh будет переведена в фоновый режим. (Это не работает, если ssh должен запросить пароль или кодовую фразу; см. также опцию -f).
- -f - Запрашивает переход ssh в фоновый режим непосредственно перед выполнением команды. Это полезно, если ssh собирается запрашивать пароли или парольные фразы, но пользователь хочет, чтобы это происходило в фоновом режиме. Это подразумевает использование -n. Рекомендуемый способ запуска X11-программ на удаленном сайте - это что-то вроде ssh -f host xterm.
Пример команды SSH, которая будет выполняться в фоновом режиме на удаленном сервере, позволяя при этом немедленно завершить сеанс SSH:
1 | ssh -n -f user@remote_server 'command_to_execute > /dev/null 2>&1 &' |
Упрощенная версия, как в примере ниже, не подавляет вывод, но тоже будет работать:
1 | time ssh -fn 192.168.1.2 "nohup sleep 10" |