Використання SSH для віддаленого запуску процесу


18

Я написав сценарій, який я використовую, щоб підштовхнути та розгорнути нову послугу на декількох машинах, що знаходяться під моїм контролем, і для виконання цього процесу я використовую ssh для віддаленого запуску процесу. На жаль, щоразу, коли я використовую SSH для запуску процесу, команда SSH ніколи не повертається, внаслідок чого скрипт зупиняється.

Команда задається як: ssh $ user @ $ host "/ root / command &". Щоразу, коли я запускаю прості команди, такі як ps або хто, команда SSH повертається негайно, проте коли я намагаюся запустити процес, вона не повертається. Я спробував хитрощі, як перетворити мій процес у простий скрипт bash, який запускає процес, а потім завершує роботу, однак це також висить команду SSH (навіть якщо скрипт bash повторюється повідомлення про успіх і завершується нормально).

Хтось має уявлення про те, що викликає таку поведінку, і як я можу отримати команду SSH повернутися, як тільки процес був запущений?

Дякуємо за вашу думку!


Опублікуйте точний командний рядок, який ви використовуєте ... опустіть паролі / імена користувачів / IP-адреси
Джозеф Керн

ssh $ SSH_USER @ $ HOST_ADDR "/ root / AppName &"
rmrobins

Слід зазначити, що я встановив SSH ключі, тому не потрібно використовувати паролі для запуску команд на віддалених системах.
rmrobins

@rmrobins, дуже хороший крок - встановлення автентичності відкритого ключа.
nik

Відповіді:


28

SSH підключає stdin, stdout та stderr віддаленої оболонки до вашого локального терміналу, тому ви можете взаємодіяти з командою, що працює на віддаленій стороні.

Як побічний ефект, він буде продовжувати працювати до тих пір, поки ці з'єднання не будуть закриті, що відбувається лише тоді, коли віддалена команда та всі її діти (!) Припиняються (адже діти, саме з чого і починається, успадковують std * від своїх батьківський процес і тримати його відкритим).

Тому потрібно використовувати щось подібне

ssh user@host "/script/to/run < /dev/null > /tmp/mylogfile 2>&1 &"

Перенаправлення <,> і 2> і 1 stdin / stdout / stderr від вашого терміналу. Потім "&" змушує ваш сценарій перейти на задній план. У виробництві ви, звичайно, перенаправлятимете stdin / err на відповідний лог-файл.

Побачити

http://osdir.com/ml/network.openssh.general/2006-05/msg00017.html

Редагувати:

Щойно з’ясували, що < /dev/nullвищезгадане не потрібно (але перенаправлення stdout / err є ). Не знаю, чому ...


Дякую, саме це я шукав - мені не прийшло в голову, що процес успадкує std * навіть при використанні & для його запуску у фоновому режимі.
rmrobins

+1! Працює для мене. Ви також можете роздрукувати вихід, відлунюючи файл журналу: ssh user@host "/script/to/run > /tmp/ssh.stdout 2>&1 && cat /tmp/ssh.stdout && rm -f /tmp/ssh.stdout"
Fishdrowned

5

Ви можете спробувати ногуп . Людина nohup для більш детальної інформації.

ssh host "nohup script &"

Якщо ви хочете зберегти вихід на віддаленій машині, ось варіант .

ssh user@host 'export REMOTE=myname; nice nohup ./my-restart >
logfile.log 2>&1 &'

5

Ще однією альтернативою було б розпалити відстороненого screen(1), на кшталт:

ssh -l user host "screen -d -m mycommand"

Це запустить окремий екран (який фіксує всю взаємодію всередині нього), а потім негайно повернеться, припиняючи сеанс ssh.

Трохи більше винахідливості ви можете вирішити досить складні віддалені виклики команд таким чином.


4
 -f      Requests ssh to go to background just before command execution.
         This is useful if ssh is going to ask for passwords or
         passphrases, but the user wants it in the background.  This
         implies -n.  The recommended way to start X11 programs at a
         remote site is with something like ssh -f host xterm.

         If the ExitOnForwardFailure configuration option is set to “yes”,
         then a client started with -f will wait for all remote port for‐
         wards to be successfully established before placing itself in the
         background.

1
Проблема цього методу полягає в тому, що команда SSH насправді не припиняється, вона просто прихована у фоновому режимі, тому у хоста, який виконує скрипт, буде велика кількість команд SSH у фоновому режимі, які ніколи не повертаються, оскільки команди SSH ніколи не повертаються ( тобто основну проблему, яку я хочу вирішити)
rmrobins

-1

Я думаю, що правильно

ssh user@host exec script.sh &

Ні, це не працює для мене. Навіщо це робити?
sleske

Я не використовував фон push над ssh, намагався без терміна під рукою. моє ліжко.
nik
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.