Каков наилучший способ выполнить удаленную команду SSH в фоновом режиме, но по-прежнему отображается?

15

Мне нужно запускать команды SSH удаленно, вывод выводится локально. Но если соединение разрывается, я хочу, чтобы команда все еще выполнялась.

Я говорю не столько о входе в систему и выполнении, но о выполнении команды ssh user @ remotehost 'commands && command etc'

Как я могу обеспечить выполнение команды, даже если разрывается соединение?

vfclists
источник

Ответы:

27

Лучший способ сделать это - использовать экран, который поддерживает постоянную открытость сеанса, даже если соединение умирает (и если вы хотите начать использовать его снова, вы можете сделать a, screen -rи он снова откроет его).

Префикс любой команды, с которой вы хотите выполнить screen(например, ssh -t user@host screen command) должен выполнить эту работу.

Если вы хотите, чтобы он работал в фоновом режиме оболочки, вы также можете добавить &к нему все.

Сокол Момот
источник
Скорее всего, вам потребуется использовать ssh -t, чтобы выделить терминал для запуска команды. В противном случае ошибка «Должен быть подключен к терминалу».
Бонсайвинг
11

Вы хотите иметь постоянный сеанс, который можно возобновить, или просто чтобы отключить соединение от прекращения действия исключения?

Для первого используйте screenдля второго nohup.

Шейн Мэдден
источник
7

Как уже упоминалось ранее, screenможно сделать все возможное. Но не только то, что вам нужно. Я использую screen на протяжении многих лет, и теперь использую его каждый раз, когда захожу в систему. Попробуйте установить screenи создать ~/.screenrcс таким конфигом:

sessionname     vcflists
startup_message off
deflogin        off
vbell           off
msgminwait      0
msgwait         10
log             off
backtick        1 0 0 hostname
caption splitonly "%?%F%{= yk}%:%{= Kk}%? %n %t%="
hardstatus alwayslastline "%{= rY}  %1`  %{= kg} %0c %{= bY}  %-w%{= Yk} %n %t %{-}%+w %=%{g}%l "

Тогда беги screen -Rd vcf. Это предпочтительный вызов экрана. Вы переподключитесь к ранее созданному сеансу с именем vcf * (или получите предупреждение, если он неоднозначный) или, если сеанс еще не открыт, он будет создан. CTRL+ Aэто мета-ключ, который делает все. CTRL+A C( CTRL+ A, затем C) создать новое окно (экран) внутри сессии. CTRL+A SPACEпереместить фокус на следующее окно в раунде. CTRL+A Dотключить текущий сеанс, сохраняя все окна работоспособными между соединениями. Если у вас есть запуск какого-то более долгого задания, вы можете отсоединиться от экрана и подключиться к нему позже, чтобы посмотреть, что произойдет. То же самое происходит, если ваш ssh-сеанс потерян - экран остается активным со всеми открытыми окнами и всеми запущенными задачами.

Если вы хотите закрыть какое-то окно внутри экрана - просто exitиз оболочки в нем. Если вы хотите закрыть все оболочки / задачи во всех окнах и выйти из экрана - просто нажмите CTRL+A CTRL+\и нажмите «Y» при появлении запроса.

Для всего остального смотрите man screen.

Kondybas
источник
2

Я видел эту альтернативу надежному ssh "like" соединению:

http://mosh.mit.edu/

Родриго Приор Бехелли
источник
С сайта mosh (мобильная оболочка) выглядит как многообещающий новый инструмент. Хотя это очень ново.
bgvaughan
1

Я бы обычно делал:

nohup mycommand &

tail -f nohup.out
gyin
источник