Запустите команду nohup через SSH, затем отключите

46

Я хочу выполнить скрипт start.shна удаленном сервере, который выполняет это:

nohup node server.js &

Наивно я называю SSH так:

ssh myserver <<EOF
./start.sh &
EOF

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

Как я могу SSH к удаленной машине, запустить nohupкоманду в фоновом режиме, а затем отключить? Я полагаю, я мог бы поставить сам процесс SSH в фоновом режиме, но это не кажется правильным.

Стив Беннетт
источник

Ответы:

40

Вы уже нашли правильный путь, вот документ.

ПРИМЕЧАНИЕ : вы можете поместить ssh (клиент) в фоновый режим, поместив символ & в конце, но вы не увидите вывод. Если вы действительно хотите это сделать, перенаправьте stdout / stderr в файл, если вам нужно проверить ответ от удаленного хоста.

В принципе, вы можете сделать это любым способом:

Непосредственно выполните команду {, s}

ssh user@host "nohup command1 > /dev/null 2>&1 &; nohup command2; command3"

ИЛИ ЖЕ

ssh user@host "$(nohup command1 > /dev/null 2>&1 &) && nohup command2 >> /path/to/log 2>&1 &"

ПРИМЕЧАНИЕ : &&требует, чтобы первая команда возвращала 0 перед выполнением второй

Используйте здесь документ

ssh user@host << EOF
nohup command1 > /dev/null 2>&1 &
nohup command2 >> /path/to/command2.log 2>&1 &
......
EOF

Выше 3 варианта должны работать для вас.

Кроме того, взгляните на ответ здесь: https://askubuntu.com/a/348921/70270

Терри Ван
источник
Спасибо, так что мне не хватало того, что я пропустил > /dev/null.
Стив Беннетт
Не совсем, > /dev/null 2>&1это отбрасывать любой вывод stdout / stderr путем перенаправления на чёрную дыру lol
Terry Wang
5
Обратите внимание, что я бы предложил использовать >> вместо просто> для записи в файлы журнала. В противном случае вы получите ошибки только с самого последнего запуска.
Алексис Уилк
Правильно ли то, что если я просто запускаю команду как nohup command2 >> /path/to/command2.log 2>&1 &в терминале, а затем закрываю терминал, процесс теряется?
Лука,
1
@TerryWang второй пример не будет работать с амперсандом, за которым следует двойной амперсанд, см. Unix.stackexchange.com/q/67006/86716
tsionyx
7

Почему бы не просто tmux или screen и покончить с этим? Например:

$ tmux new -s SessionNameHere
$ nohup /path/to/your/script.sh

Это практично, если это что-то, что будет постоянно зацикливаться или займет некоторое время, чтобы закончить. Вы можете отключиться от сеанса, и он останется активным.

скоро
источник
2
Не совсем соответствует тому, что я прошу, это одна команда, которая может быть запущена на моем ноутбуке, которая подключится, разветвляется, затем отключается.
Стив Беннетт
3
ssh node "nohup sleep 10 &"

не работает в режиме демона, сохраняя сессию ssh подключенной. Ssh сессия вернется через 10 секунд, несмотря на то, что вы использовали nohup.

Причина в том, что удаленные stdout и stderr все еще подключены к вашему сеансу. Он поддерживает сессию ssh, nohup не помогает.

Этот:

ssh node "nohup sleep 10 1>/dev/null 2>/dev/null &"

возвращается немедленно. Он запускает удаленный процесс с nohup и немедленно выходит из сеанса ssh.

Сергей Черепанов
источник
Это была именно наша проблема. У нас был только 1> file.log. Ssh на одной машине застрял. Процесс на компьютере «узла» был запущен. Когда мы добавили 2> & 1 перед закрытием &, это позволило ssh отключиться.
Ли Меадор
2

Короче форма:

ssh host "(command 1; command 2; ...) &>/dev/null &"

Похоже, что bash сам выполняет отсоединение от терминала, поэтому nohup не требуется. Я запускаю Ubuntu 14.04 x86_64, bash 4.3.11.

Alek_A
источник
1
Это не дает ответа на вопрос. Чтобы критиковать или запрашивать разъяснения у автора, оставьте комментарий под его постом - вы всегда можете комментировать свои собственные посты, и, когда у вас будет достаточно репутации, вы сможете комментировать любые посты . - Из обзора
Дэвид Фёрстер
Это не похоже на работу. nohup; просто выводит жалобу на недостающие аргументы.
Стив Беннетт
@DavidFoerster, не знаю, почему, если command 1; command 2; ...представляет сценарий OP хотят запустить. ОП также может использовать особый случай этого ответа:ssh myserver ./start.sh &>/dev/null &
Alek_A