Запустіть команду 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 не буде працювати з ampersand з подальшим подвійним ampersand, див. Unix.stackexchange.com/q/67006/86716
tsionyx

7

Чому б не просто tmux або екран, а зробити це з ним? Наприклад:

$ 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.


1
Це не дає відповіді на запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх публікацією - ви завжди можете коментувати свої власні публікації, і коли ви матимете достатню репутацію, ви зможете коментувати будь-яку публікацію . - З огляду
Девід Фоерстер

Це, здається, не працює. nohup; просто видає скаргу на відсутні аргументи.
Стів Беннетт

@DavidFoerster, немає ідеї, чому, якщо command 1; command 2; ...представляє сценарій OP, хочеться запустити. ОП також може використовувати особливий випадок цієї відповіді:ssh myserver ./start.sh &>/dev/null &
Alek_A
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.