Як зберегти процеси після закінчення сеансу ssh?


Відповіді:


750

Вам слід шукати такі сучасні альтернативи tmux.

tmuxє кращим з screenбагатьох причин, ось лише кілька прикладів:

  • Windows можна переміщувати між сеансами і навіть підключати до декількох сеансів
  • Вікна можна розділити по горизонталі та вертикалі на панелі
  • Підтримка UTF-8 та 256 кольорових терміналів
  • Сеанси можна керувати з оболонки без необхідності вводити сеанс

Основна функціональність

Щоб отримати той самий функціонал, як пояснено у відповіді, що рекомендує screen, вам потрібно зробити наступне:

  • ssh у віддалену машину
  • почніть tmuxз введення tmuxв оболонку
  • запустити потрібний процес всередині розпочатого tmuxсеансу
  • залишити / відключити tmuxсеанс, набравши Ctrl+, bа потімd

Тепер ви можете безпечно вийти з віддаленої машини, ваш процес буде тривати всередині tmux. Коли ви знову повернетесь і хочете перевірити стан свого процесу, ви можете використовувати його tmux attachдля приєднання до свого tmuxсеансу.

Якщо ви хочете, щоб кілька сеансів працювали поруч, слід назвати кожен сеанс, використовуючи Ctrl+ bі $. Ви можете отримати список поточно запущених сеансів за допомогою tmux list-sessions, тепер додайте до запущеного сеансу за допомогою команди tmux attach-session -t 0.

tmuxможе зробити набагато більш досконалі речі, ніж обробляти одне вікно за один сеанс. Для отримання додаткової інформації відвідайте сторінку Tmuxman tmux або GitHub . Зокрема, ось поширені запитання про основні відмінності між screenта tmux.


4
@CraigM Використовуйте screen -x -r [screenname]або screen -rxкоротко, якщо у вас активний лише один екран. Це дозволяє приєднати існуючий екземпляр екрана.
Лекенштейн

5
Ця порада допомогла мені з тією ж проблемою, але я думаю, що вона містить помилку друку. Я впевнений, що вам потрібно набрати, Ctrl-bа потім dдля того, щоб залишити / відключити tmuxсеанс. Звичайно, це стосується версії tmuxмого Ubuntu 12.04.
cxrodgers

17
Я помилився, дотримуючись вищевказаних інструкцій. Я поділюсь цим, якщо хтось може потрапити в ту саму помилку: я почав tmux в оболонці власного комп'ютера замість оболонки віддаленого комп'ютера. Потрібно запустити tmux в оболонці віддаленого комп'ютера.
Мерт Нухоглу

5
Тепер екран знову розробляється: list.gnu.org/archive/html/screen-devel/2014-04/msg00024.html Не могли б ви оновити свою відповідь?
муру

4
Крім того, біжіть tmux detachзамість набору текстуctrl-b d
Ендрю

305

Варіант 1: nohup

Найкращий спосіб найчастіше найпростіший.

nohup long-running-command &

Він був зроблений спеціально для цього, він навіть записує stdout до nohup.log.

man nohup

Варіант 2: bg

Якщо ви хочете "виконати" деякі вже запущені завдання, то найкраще ставити Ctrl+, Zа потім запустити

bg

щоб викласти своє останнє призупинене завдання на другий план, щоб воно могло продовжувати виконуватись.

Потім швидкий disownповинен продовжувати процес після виходу з системи.

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

Майте на увазі, і те, і інше є специфічними для баш. Якщо ви не використовуєте bash, команди можуть бути різними.


4
Я б рекомендував зробитиdisown -h
Michele

що цікаво, екран і tmux не працює для шахтера, але працює
нор

1
bg+ disownне працював для мене. У мене був запущений сценарій розгортання, я забув запустити всередині tmux, і мені потрібно було піти рано на зустріч. Сценарій постійно виводить на оболонку прогрес. ctrl+zзупинив процес, повернувши мене на удар. bgвідновив процес, але він також відновив виведення статусу на баш, не даючи змоги побачити, що я набирав. Однак disownкоманда створила "відмовився: поточний: немає такої роботи"
BrianHVB

це не спрацювало для мене з julia myFile.jlбудь-якої причини. tmux робить і чудово.
kilgoretrout

Це працювало для мене, велике спасибі
Чад

207

Ви можете це зробити, використовуючи screen.

Введіть, man screenщоб дізнатися більше або прочитати цю сторінку чоловіка екрана .

Простий сценарій:

  • ssh у віддалений ящик. Введіть screenПотім запустіть потрібний процес.

  • Натисніть Ctrl- Aпотім Ctrl- D. Це "від'єднає" ваш сеанс на екрані, але залишить ваші процеси. Тепер ви можете вийти з віддаленого вікна.

  • Якщо ви хочете повернутися пізніше, увійдіть ще раз і введіть screen -rЦе дозволить "відновити" ваш сеанс на екрані, і ви зможете побачити результати свого процесу.


32
Зазвичай я називаю свої екранні сеанси, screen -S nameщоб полегшити підключення до правильного пізніше.
Девід Онелл

Посилання вниз
Gab 是 好人

1
Особисто я працюю над коробкою без будь-якого програмного забезпечення для контролю пакетів. Витративши близько півгодини на побудову залежностей від TMUX (що я особисто маю досвід і мені подобається) від джерела, стало зрозуміло, що екран для мене краще і простіше рішення. TL; DR: оптимальне рішення цієї проблеми залежить від випадку використання, машини та кількості часу, з якого ви повинні налаштуватись. Дякую за цю відповідь :)
Макс фон Гіппель

Поєднання з screen -Sперед відпусткою та screen -rповерненням дивовижне!
Меломан

Дякую за це Це рішення працювало для мене, поки tmux цього не робив (я використовую версію bash для Windows під час ssh'ing в машину linux)
Michael Sorensen

83

Екран і ногуп - це кращий спосіб, але якщо вам доведеться від'єднати процес, який вже працює без екрана або nohup, ви можете запустити команду відключення.

disown [-ar] [-h] [jobspec… |pid… ]

Без параметрів видаліть кожнуспеціальну роботу з таблиці активних завдань. Якщо -hпараметр заданий, завдання не видаляється з таблиці, а позначається так, що SIGHUP не надсилається до завдання, якщо оболонка отримує SIGHUP. Якщо jobspec відсутня, і не вводиться-a ні -rопція, ні опція, використовується поточне завдання. Якщо не вказано жодних робочих місць , -aопція означає видалити або позначити всі завдання; -rваріант без jobspec аргументу обмежує операцію виконання завдань.

З відмовою ви можете закрити термінал і запустити процес на машині.


10
Це також мій улюблений спосіб це зробити. Я часто використовуюdisown -a && exit
Стефано Палацо

1
Ідеально. Це прекрасна команда і заслуговує на всі оновлення!
Грег

8
одним словом обережності, я зупинив запущений процес із Ctrl-Z і не запускав його у фоновому режимі, перш ніж дзвонити, disownі це вбило його.
HDave

3
Може вийти з ладу, якщо він хоче написати в термінал. Перенаправити висновок запущеного процесу не так просто. Краще почати це правильно з нохупом.
jiggunjer

2
Це гарна відповідь, адже вона безпосередньо відповідає на питання. Автор запитання запитав, що робити після того, як вже виконав купу довгих команд, що виконуються. Більшість із цих відповідей дають вам знати, що робити перед виконанням команд.
q0rban

53

Я застряг у великому телевізорі, тому мені не вдалося зупинити процес, екран налаштування, а потім запустити його заново. Мені вдалося вийти з сеансу ssh із запущеним процесом, по суті виконавши такі кроки:

  1. ssh [сервер]
  2. командування
  3. Ctrl+Z
  4. bg
  5. відключити [необов’язковий процес Pid, ​​за замовчуванням триває]
  6. Вхід

Крок 3 призупиняє поточний процес (наприклад, моя команда 'mv').
Етап 4 ставить призупинений процес на другий план і відновлює його.
Крок 5 дозволяє відхилити процес. ** Щоб отримати список завдань, просто введіть jobsпопередньо.


** Щодо відмови (з посібника з bash):

disown [-ar] [-h] [jobspec ... | pid ... ]
              Without  options,  remove  each jobspec from the table of active
              jobs.  If jobspec is not present, and neither the -a nor the  -r
              option  is  supplied, the current job is used.  If the -h option
              is given, each jobspec is not removed from  the  table,  but  is
              marked  so  that  SIGHUP  is  not  sent  to the job if the shell
              receives a SIGHUP.  If no jobspec is  supplied,  the  -a  option
              means  to  remove or mark all jobs; the -r option without a job‐
              spec argument restricts operation to running jobs.   The  return
              value is 0 unless a jobspec does not specify a valid job.

2
Вбудовані завжди є моїм першим вибором :) THX
ken_oy

Цю відповідь слід позначити правильною. Щоб встановити та звикнути до екрана для вирішення цієї проблеми, перебільшено.
Ульріх-Лоренц Шлютер

Це дуже корисно, коли ви вже запустили будь-яку команду і яка працює довго. Припинення та запуск його на сесії TMUX займе час
Deepali Mittal

1
@ tom-brossman: Будь ласка, стежте за такими непотрібними редакціями, як ця ! Якщо виклик без специфікації завдання, disownвбудована команда діє на останнє фонове завдання.
Девід Фоерстер

22

Є дві основні програми, які можна використовувати для підтримання програм і стану терміналу для декількох з'єднань ssh. Вони є екраном (діючий, але, на жаль, непідтримуваний. Мабуть , зараз активно розвиваються ) та tmux (новіший, активно підтримується). Byobu - це передній кінець, який може працювати над їхніми системами та пропонувати додаткову інформацію про стан ubuntu. У нових установках він використовуватиме tmux як бекенд, якщо у вас є старша інсталяція byobu та наявна конфігурація, вона підтримуватиме попередній бекенд, будь то екран або tmux.

Бьобу

Byobu можна встановити на комп'ютер, зробивши це в машині на базі Debian:

sudo aptitude install byobu

Використовуючи yum, ви робите

su -c 'yum install byobu'

Також можна встановити byobu на інших дистрибутивах.

Використання byobu

Ви можете розпочати byobu, запустивши byobuна хост-машині після підключення за допомогою ssh. Це дасть вам оболонку, яка виглядає приблизно так:

образ-бьобу

Ви також можете використовувати термінал Byobu на машині Ubuntu з опцією -X і легко мати ідеально працюючу byobu.

Використання:

Почніть byobu, набравши byobu.

Ви можете натиснути F2, щоб створити нове вікно протягом поточного сеансу, F3-F4 для перемикання між різними вікнами.

Найкраща частина byobu - вам не потрібно насправді вбивати процеси, що працюють у терміналі, щоб покинути термінал. Ви можете просто надіслати екран / tmux (скелет byobu) на задній план та відновити наступний раз:

  • Щоб залишити Bybu і зберегти його працює (від'єднати), натисніть F6.
  • Наступного разу, коли ти прийдеш, просто роби, byobuі ти повернешся туди, де ти був.

    byobu-відокремлювати-прикріплювати

Ви також можете створювати різні сеанси byobu byobu -S session1тощо. І ви можете підключитися до будь-якого з них, коли повернетесь.

Ви можете зробити набагато більше, використовуючи Byobu. Використай це! Деякі остаточні посібники тут чи тут .


Я спробував використати byobu з сеансу, заснованого на PuTTY, до свого вікна Ubuntu, але я повторюю рядок стану та прокручую на дисплеї. Незважаючи на те, що він від'єднався правильно, натискаючи F6, це не було корисним рішенням у моїй установці.
jfmessier

1
@jfmessier Це тому, що PuTTY не сприймає ncurses (в основному utf-8). Усунути цю проблему можна, дотримуючись цієї теми - stackoverflow.com/questions/10731099/…
SiddharthaRT

Це круто! 1. Це дає мені кольорову Баш підказку , що я не можу здатися , щоб включити з Баш в моїй оболонки по замовчуванням і 2. я отримую запустити 2 ботів , в той же час і до сих пір є ще один термінал , щоб зробити роботу на! @SiddharthaRT, ти заслуговуєш на вигідний сер!
Dev

18

Ви не можете цього зробити, як тільки процес розпочався, вам потрібно налаштувати речі, перш ніж виконувати тривалу роботу.

Ви можете використовувати nohup, але сучасна мудрість пропонує використовувати екран або byobu для входу, щоб ви могли від'єднати та залишити роботу.

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

Тут є розумний посібник для початку роботи з екраном .

byobu ставить простий у користуванні інтерфейс на верхній частині екрана з меню тощо. Це також поточна реалізація екрана на новіших ubuntu. F2 для запуску нового терміналу F3 / F4 для переключення вперед-назад і F6 для відключення. Введіть вихід на фактично кінцеві термінали назавжди.


Byobu використовує tmux в наші дні ..
scottl

12
"Ви не можете цього зробити, як тільки процес розпочався, вам потрібно налаштувати речі, перш ніж виконувати тривалу роботу." - ні, ви можете використовувати disownдля досягнення цього. Дивіться відповідь @ bassgey
Багатий

1
після зусиль вивчити екран і tmux .... byobu приніс мені сльози на очі
HDave

disownі якщо потрібно просто Ctrl-z, то bgщоб дістати його з активного терміналу і на другий план. Тоді disown.
mimoralea

8

Гей, поки я погодився, що екран - це найефективніший варіант. Ви можете використовувати vncserver, а потім запустити процес на ньому.

Крім того, якщо ваш єдиний інтерес полягає в тому, щоб процес запущений і вам не потрібно було повертати контроль над ним, і вкрай важливо, щоб ви не знали, що вам потрібно буде закрити сеанс, і процес вже запущений, вам не пощастить, якщо ви використовували bash як оболонку

Спочатку потрібно надіслати процес у фоновий режим, ввівши Ctrl + Z, а потім bg% 1 (число залежить від номера завдання, зазвичай це 1, але ви можете легко витягнути список за допомогою командних завдань)

Нарешті, виклик команди відключення (слідом за виконанням завдання ... те саме, що і команда bg)

Це видалить відносини батько-дитина між вашою оболонкою та процесом у фоновому режимі, не даючи їй загинути після припинення роботи оболонки.


2
Ця відповідь найкраща! Чому всі говорять screen, було поставлено питання про подію після входу в систему, як тримати процеси, вже після входу в систему, але перед їх запуском. Чудова відповідь, Хорхе, ти мені справді допоміг! :)
jwbensley

1
Просто bg(без %1) досить часто, оскільки за замовчуванням є поточна робота
Уолтер Трос

Було б непогано мати вичерпну відповідь: A priori (налаштування заздалегідь): екран терміналу ascii (старий), tmux (ближче); X windows: vnc (старий, досі підтримується), xpra (новіший), без xpra без корінь. Задня частина (зберігається після того, як ви почали): ^ Z, відхрестився, ... Але я лінивий, щоб викласти це більше, ніж це.
Krazy Glew

8

Для одного сценарію оболонки, який я працюю протягом тривалого періоду часу, я ввійду в систему та запускаю процес у фоновому режимі, використовуючи "&".

Приклад:

/path/to/my/script &

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


3
Так, я хотів би знати, наскільки екран / tmux кращий, ніж це просте рішення.
Mads Skjern

Так, я можу це бачити і на моєму ubuntu, але теоретично це не повинно відбуватися. Я не розумію, чому
Даніель Піньол

1
@MadsSkjern Тому що ви не можете ввести будь-який вхід до сценарію за допомогою цього методу.
Кен Шарп

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

4

Ви повинні переглянути екран GNU і подивитися, чи допомагає він вам. Залежно від того, як вам потрібна програма для запуску в режимі реального часу, це може спричинити більше проблем, ніж вирішує, але принаймні це дозволить вам відновити сеанс так, ніби ви ніколи не виходили з нього.

Як користуватись :

  • Використовуйте команду screenдля першого запуску, прокручуйте вступні повідомлення, вам слід вручити термінал.
  • Ca Cc відкриває ще один термінал
  • Ca Ck вбиває термінал
  • Ви можете використовувати Ca C-Space та Ca C-Backspace для проїзду через термінали
  • Ca Ca зручно, якщо ви в основному використовуєте лише два термінали
  • Ca Cd відключає поточний сеанс на екрані та виходить з екранів. Потім можна використовувати screen -rдля відновлення сеансу. Ви можете мати декілька відокремлених сеансів на екрані одночасно; у цьому випадку вам буде показаний список доступних сеансів.

Існує багато інших варіантів, наприклад розділені екрани, а також усі ярлики повністю настроюються.


3

Найпростіша відповідь ...

ctrl + z призупинить запущену програму

"bg" запустить його у фоновому режимі


5
Не відмовляючись від процесу (з чимось подібним disownабо nohup), це зазвичай не триматиме процес після закінчення сеансу SSH.
Елія Каган

3
На моєму сервері Ubuntu, з налаштуваннями за замовчуванням, він дійсно продовжує працювати!
Mads Skjern

3

Найпростіший спосіб - запустити свою команду у фоновому режимі за допомогою &. Тоді просто напишіть:

disown -a

0

Хоча всі кажуть, що використовувати disown(єдиний варіант, який ви маєте після того, як ви вже запустили процес), nohupабо навіть запустивши команду в screen, що корисно, якщо ви хочете побачити всі результати з команди ... Я фанат screen.. Я все ще пробував останні останні дистрибутиви Linux, а просто розміщення роботи на задньому плані та вихід із роботи не призводить до вмирання всіх запущених процесів. Має бути глобальна установка чи щось таке. Я пробую це на деяких досить старих системах (slackware 12), і мій тестовий сценарій продовжує працювати, поки я вручну не вбиваю його:

shell$ cat > test.pl

#!/usr/bin/perl
while(1){
     sleep(1);
}
    shell$ perl ./test.pl &
    shell$ exit
    logout
    shell$ ps aux test.pl
    mymom 31337     1  0 13:25 ?        00:00:00 perl ./test.pl
    shell$ 

Хоча я погоджуюся, що це screenбув би найкращий спосіб запустити це, навіть якщо мій сценарій писав у лог-файли чи будь-що інше. Мені ніколи не потрібно було користуватися disown -a або, nohupякщо це не вийшло з цілковитої параної. Може хтось може пролити трохи світла на те, як поводиться Баш за замовчуванням? Можливо, деякі системні адміністратори змінюють за замовчуванням великі оболонки, щоб утримати процеси своїх користувачів від перевантаження системи?


Якщо у вас є додаткові запитання, будь ласка, задайте це як нове запитання
heemayl

0

На жаль, припинене сеанс SSH може призвести до відключення tmux або екрана. Це відбувається тому systemd, що припинять будь-які дочірні процеси після виходу з сеансу.

Ви можете змінити цей параметр у вашому logind.conf( /etc/systemd/logind.conf):

KillUserProcesses=no

Завдяки відповіді на https://unix.stackexchange.com/questions/490267 .


-1

Замість :

cmd options; 

Додати перед nohup:

nohup cmd options & 

Тоді ви зможете побачити контур консолі:

tail -f nohup.out
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.