Используйте SSH для запуска фонового процесса на удаленном сервере и выхода из сеанса
Я использую SSH для запуска фонового процесса на удаленном сервере. Это то, что у меня есть на данный момент:
ssh [email protected] "nohup process &"
Это работает, так как процесс начинается. Но сам сеанс SSH не заканчивается, пока я не ударил Ctr-C.
Когда я нажимаю Ctr-C, удаленный процесс продолжает работать в фоновом режиме.
Я хотел бы поместить команду ssh в script, которую я могу запустить локально, поэтому я хотел бы, чтобы ssh-сессия завершилась автоматически после запуска удаленного процесса.
Есть ли способ сделать это?
Ответы
Ответ 1
Параметр "-f" для ssh указывает ssh на запуск удаленной команды в фоновом режиме и немедленное возвращение. Например.
ssh -f [email protected] "echo foo; sleep 5; echo bar"
Если вы наберете выше, вы сразу же получите приглашение командной оболочки, после чего увидите вывод "foo". Через пять секунд вы увидите "бар". В то же время вы могли бы использовать оболочку.
Ответ 2
При использовании nohup
убедитесь, что вы также перенаправляете stdin, stdout и stderr:
ssh [email protected] 'DISPLAY=:0 nohup xeyes < /dev/null > std.out 2> std.err &'
Таким образом, вы будете полностью отделены от удаленного процесса. Будьте осторожны с использованием ssh -f [email protected]
, поскольку это приведет только к процессу ssh в фоновом режиме на вызывающей стороне. Вы можете проверить это, запустив ps -aux | grep ssh
на вызывающем компьютере, и это покажет вам, что вызов ssh по-прежнему активен, но просто помещен в фоновый режим.
В моем примере выше я использую DISPLAY=:0
, так как xeyes - это программа X11, и я хочу, чтобы она была запущена на удаленной машине.
Ответ 3
Вы можете использовать screen
для запуска процесса на этом экране, отсоединиться от экрана Ctrl-a :detach
и выйти из текущего сеанса без проблем. Затем вы можете снова подключиться к SSH и снова подключиться к этому экрану, чтобы продолжить выполнение своей задачи или проверить, завершено ли это.
Или вы можете отправить команду на уже запущенный экран. Ваш локальный script должен выглядеть следующим образом:
ssh [email protected]
screen -dmS new_screen sh
screen -S new_screen -p 0 -X stuff $'nohup process \n'
exit
Подробнее см. tutorial