Подтвердить что ты не робот

Используйте SSH для запуска фонового процесса на удаленном сервере и выхода из сеанса

Я использую SSH для запуска фонового процесса на удаленном сервере. Это то, что у меня есть на данный момент:

ssh [email protected] "nohup process &"

Это работает, так как процесс начинается. Но сам сеанс SSH не заканчивается, пока я не ударил Ctr-C.

Когда я нажимаю Ctr-C, удаленный процесс продолжает работать в фоновом режиме.

Я хотел бы поместить команду ssh в script, которую я могу запустить локально, поэтому я хотел бы, чтобы ssh-сессия завершилась автоматически после запуска удаленного процесса.

Есть ли способ сделать это?

4b9b3361

Ответ 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