Запобігати знищенню поточного завдання Linux після виходу з SSH


18

У мене є обчислювальне завдання, яке працює кілька днів на сервері Linux через SSH-з'єднання. Це не на задньому плані, тому з'єднання SSH перебуває під цим завданням.

Я хочу перезапустити локальну машину (а не сервер), з якої я відкрив ssh сесію, але хочу продовжувати роботу. Це можливо?

Відповіді:


22

Якщо ваше завдання вже запущена, то занадто пізно , *щоб розглянути альтернативні рішення , які вставляють додатковий шар між sshсесією і оболонкою виконується команда, як screen, tmux, byobu, nohupі любить.

Якщо ваша підтримка процес буде виконуватися у фоновому режимі і , в зокрема , не зависає , коли stdoutі stderrв запису нового / закрито, ви можете помістити його в фоновому режимі перед виходом з системи з ControlZі bgпотім від'єднати його від оболонки з disownвбудованою командою.

наприклад:

$ ssh localhost
You have new mail.
Last login: Fri Jun  6 11:26:56 2014

$ /bin/sleep 3600    


^Z[1] + Stopped                  /bin/sleep 3600
$ bg
[1] /bin/sleep 3600&
$ jobs
[1] +  Running                 /bin/sleep 3600
$ disown %1
$ exit
Connection to localhost closed.
$ ps -ef|grep sleep
jlliagre 12864     1  0 21:12 ?        00:00:00 /bin/sleep 3600
jlliagre 13056 12477  0 21:13 pts/18   00:00:00 grep sleep
$ 

*Як зауважив Боб, насправді існує кілька шахрайських способів відновити сеанс у Tty під Linux. repty, retty , injcode та neercs . Самий передовий зовнішній вигляд виглядає рептиром, але вам можуть знадобитися привілеї root, щоб ptrace змогла зламати ваш процес.


Я використав Ctrl + Z, робота зупинилась і перейшла до фону, після чого виконувала disownкоманду. Повертається: bash: попередження: видалення зупиненого завдання 1 з групою процесів 24876. Тепер моя робота внесена до списку, ps -allале, здається, не працює (використання процесора 0%)
Алі

Здається, мій процес зупинений. Я думаю, я мав би надати ідентифікатор процесора disownкомандою
Алі

@Ali Я думаю, ви забули виконати команду bg, щоб відновити призупинену роботу.
Джейсон Чжу

1
@JasonZhu Дякую за вказівку на це. У bgпершій частині моєї відповіді було незрозуміло команду. Відредаговано.
jlliagre

2
Якщо ви забули команду bg і виконали лише команду disown, ви повинні мати змогу знову запустити процес, kill -CONTякий робить приблизно те саме, що і bg.
kasperd

5

Одне рішення - використовувати екран GNU . Ви можете запустити screen, запустити свою команду, а потім від'єднатися C-a d. Пізніше, щоб знову підключитися, зробіть screen -rі ви знову на попередньому сеансі.

Інші переваги екрана - це управління вікнами (тому ви можете переходити на інші оболонки, поки ваша команда працює, не потребуючи нового з'єднання SSH), і це дозволяє вашій команді залишатися на передньому плані, будь то в поточному сеансі чи пізнішому.

Редагувати: Як зазначено в коментарях, це буде працювати лише в тому випадку, якщо ви пам’ятаєте, що починати screenперед запуском команди Якщо команда вже запущена, вам знадобиться рішення @ jlliagre.


2
tmux- це ще одна така програма, screenяка дозволяє проводити віддалений сеанс, який не прив’язаний до поточного з'єднання SSH.
Darth Android

2
Ваше рішення чудове. Однак це не повністю відповідає моєму питанню - я запитав про поточно запущений процес, а не про процес, який слід запустити в майбутньому screen.
Алі

Ага, гаразд. У такому випадку, я думаю, вам потрібно буде використовувати рішення @ jlliagre. (Наскільки я знаю, немає способу підключити вже запущений процес до чогось подібного screenабо tmux.)
Скотт Велдон

1

Один із "стандартних" способів зробити це - використовувати nohupкоманду, включену до coreutilsцього:

nohup COMMAND [ARGS] &

Але команда буде перенаправляти вихід ( STDOUT& STDERRAFAIK) програми у файл nohup.out, роблячи його якось дратує (наприклад, генеруючи величезний файл журналу), тож ви можете зробити власне перенаправлення або перенаправити його на / dev / null якщо хочете.


2
Прочитайте ще раз. Процес вже запущений .
Гонки легкості по орбіті

/ соромно не читав уважно. Вибачте.
wangguoqin1001

Насправді nohupдля цього можна використовувати. Просто призупиніть запущений процес і відправте його у фоновий режим ( Ctrl+ Zі запустіть bg), і тоді ви можете опублікувати nohup %1.
Майк

0

Окрім того, nohupви можете запустити процес у фоновому режимі, використовуючи "&" та підрозділ:

Суфіксуйте команду з & і загорніть її в дужки

$ (thecommand args &)

Скажімо, ваш процес отримує під 1922:

$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
usr      11473  2643  0 15:07 pts/1    00:00:00 bash
usr      11922     1  0 15:11 pts/1    00:00:00 thecommand

Подивіться, що це не приєднано до процесу оболонки 11473, який був його початковим батьківським. Отже, якщо ви вийдете або вб'єте поточну оболонку (11473), процес 11922 продовжує працювати, і він буде відключений від очок.

Спробуйте вийти з оболонки та введіть нову оболонку. Навіть якщо ця оболонка підключена до одних і тих же очок, ви можете бачити процес зараз без pts:

$ ps -fp 11922
UID        PID  PPID  C STIME TTY          TIME CMD
usr      11922     1  0 15:11 ?        00:00:00 thecommand

Я не знаю, як це називається або задокументовано в Posix, але я використовую цей шлях з 1990 року в bsh, ksh і тепер у bash.

Нарешті, ви можете використовувати bgвбудовану команду оболонки:

Просто запустіть програму, і якщо ви вирішите призупинити її або плануєте залишати її у фоновому режимі, наберіть CTRL + Z:

$ thecommand
^Z
[1] Stopped          thecommand

Тепер нехай він продовжує працювати у фоновому режимі:

$ bg
[1]+ thecommand &

Якщо ви подивитесь на інформацію про процес, він ще має батьківський процес:

$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
usr      12046  2643  0 15:18 pts/6    00:00:00 bash
usr      12571 12046  0 16:00 pts/6    00:00:00 thecommand
usr      12601 12046  0 16:04 pts/6    00:00:00 ps -f

Отже, вихід із поточного процесу. Процес запуску у фоновому режимі не пов’язаний із початковим батьківським і продовжує працювати у фоновому режимі:

$ exit

Ще раз увійдіть та подивіться інформацію про процес:

$ ps -f 12571
UID        PID  PPID  C STIME TTY          TIME CMD
usr      12571     1  0 16:00 ?        00:00:00 thecommand
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.