Скажімо, я запускаю купу процесів із сеансу ssh. Чи можливо припинити сеанс ssh, зберігаючи ті процеси, що працюють на віддаленій машині?
Скажімо, я запускаю купу процесів із сеансу ssh. Чи можливо припинити сеанс ssh, зберігаючи ті процеси, що працюють на віддаленій машині?
Відповіді:
Вам слід шукати такі сучасні альтернативи tmux.
tmuxє кращим з screenбагатьох причин, ось лише кілька прикладів:
Щоб отримати той самий функціонал, як пояснено у відповіді, що рекомендує screen, вам потрібно зробити наступне:
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.
screen -x -r [screenname]або screen -rxкоротко, якщо у вас активний лише один екран. Це дозволяє приєднати існуючий екземпляр екрана.
Ctrl-bа потім dдля того, щоб залишити / відключити tmuxсеанс. Звичайно, це стосується версії tmuxмого Ubuntu 12.04.
tmux detachзамість набору текстуctrl-b d
nohupНайкращий спосіб найчастіше найпростіший.
nohup long-running-command &
Він був зроблений спеціально для цього, він навіть записує stdout до nohup.log.
man nohup
bgЯкщо ви хочете "виконати" деякі вже запущені завдання, то найкраще ставити Ctrl+, Zа потім запустити
bg
щоб викласти своє останнє призупинене завдання на другий план, щоб воно могло продовжувати виконуватись.
Потім швидкий disownповинен продовжувати процес після виходу з системи.
screenі інші можуть це робити, але це не те, для чого вони потрібні. Я рекомендую nohupдля завдань, які ви знаєте, що збираєтесь залишити позаду, і bgдля завдань, які вже запущені, і не хочете перезапускатися.
Майте на увазі, і те, і інше є специфічними для баш. Якщо ви не використовуєте bash, команди можуть бути різними.
disown -h
bg+ disownне працював для мене. У мене був запущений сценарій розгортання, я забув запустити всередині tmux, і мені потрібно було піти рано на зустріч. Сценарій постійно виводить на оболонку прогрес. ctrl+zзупинив процес, повернувши мене на удар. bgвідновив процес, але він також відновив виведення статусу на баш, не даючи змоги побачити, що я набирав. Однак disownкоманда створила "відмовився: поточний: немає такої роботи"
julia myFile.jlбудь-якої причини. tmux робить і чудово.
Ви можете це зробити, використовуючи screen.
Введіть, man screenщоб дізнатися більше або прочитати цю сторінку чоловіка екрана .
Простий сценарій:
ssh у віддалений ящик. Введіть screenПотім запустіть потрібний процес.
Натисніть Ctrl- Aпотім Ctrl- D. Це "від'єднає" ваш сеанс на екрані, але залишить ваші процеси. Тепер ви можете вийти з віддаленого вікна.
Якщо ви хочете повернутися пізніше, увійдіть ще раз і введіть screen -rЦе дозволить "відновити" ваш сеанс на екрані, і ви зможете побачити результати свого процесу.
screen -S nameщоб полегшити підключення до правильного пізніше.
screen -Sперед відпусткою та screen -rповерненням дивовижне!
Екран і ногуп - це кращий спосіб, але якщо вам доведеться від'єднати процес, який вже працює без екрана або nohup, ви можете запустити команду відключення.
disown [-ar] [-h] [jobspec… |pid… ]Без параметрів видаліть кожнуспеціальну роботу з таблиці активних завдань. Якщо
-hпараметр заданий, завдання не видаляється з таблиці, а позначається так, що SIGHUP не надсилається до завдання, якщо оболонка отримує SIGHUP. Якщо jobspec відсутня, і не вводиться-aні-rопція, ні опція, використовується поточне завдання. Якщо не вказано жодних робочих місць ,-aопція означає видалити або позначити всі завдання;-rваріант без jobspec аргументу обмежує операцію виконання завдань.
З відмовою ви можете закрити термінал і запустити процес на машині.
disown -a && exit
disownі це вбило його.
Я застряг у великому телевізорі, тому мені не вдалося зупинити процес, екран налаштування, а потім запустити його заново. Мені вдалося вийти з сеансу ssh із запущеним процесом, по суті виконавши такі кроки:
Крок 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.
disownвбудована команда діє на останнє фонове завдання.
Є дві основні програми, які можна використовувати для підтримання програм і стану терміналу для декількох з'єднань ssh. Вони є екраном (діючий, але, на жаль, непідтримуваний. Мабуть , зараз активно розвиваються ) та tmux (новіший, активно підтримується). Byobu - це передній кінець, який може працювати над їхніми системами та пропонувати додаткову інформацію про стан ubuntu. У нових установках він використовуватиме tmux як бекенд, якщо у вас є старша інсталяція byobu та наявна конфігурація, вона підтримуватиме попередній бекенд, будь то екран або tmux.
Byobu можна встановити на комп'ютер, зробивши це в машині на базі Debian:
sudo aptitude install byobu
Використовуючи yum, ви робите
su -c 'yum install byobu'
Також можна встановити byobu на інших дистрибутивах.
Ви можете розпочати byobu, запустивши byobuна хост-машині після підключення за допомогою ssh. Це дасть вам оболонку, яка виглядає приблизно так:

Ви також можете використовувати термінал Byobu на машині Ubuntu з опцією -X і легко мати ідеально працюючу byobu.
Почніть byobu, набравши byobu.
Ви можете натиснути F2, щоб створити нове вікно протягом поточного сеансу, F3-F4 для перемикання між різними вікнами.
Найкраща частина byobu - вам не потрібно насправді вбивати процеси, що працюють у терміналі, щоб покинути термінал. Ви можете просто надіслати екран / tmux (скелет byobu) на задній план та відновити наступний раз:
Наступного разу, коли ти прийдеш, просто роби, byobuі ти повернешся туди, де ти був.

Ви також можете створювати різні сеанси byobu byobu -S session1тощо. І ви можете підключитися до будь-якого з них, коли повернетесь.
Ви можете зробити набагато більше, використовуючи Byobu. Використай це! Деякі остаточні посібники тут чи тут .
Ви не можете цього зробити, як тільки процес розпочався, вам потрібно налаштувати речі, перш ніж виконувати тривалу роботу.
Ви можете використовувати nohup, але сучасна мудрість пропонує використовувати екран або byobu для входу, щоб ви могли від'єднати та залишити роботу.
Екран має ту перевагу, що ви можете від'єднатись від однієї машини та повторно приєднатись до іншої, що зручно, якщо ви хочете перевірити тривалі процеси, що працюють за межі кінця робочого дня.
Тут є розумний посібник для початку роботи з екраном .
byobu ставить простий у користуванні інтерфейс на верхній частині екрана з меню тощо. Це також поточна реалізація екрана на новіших ubuntu. F2 для запуску нового терміналу F3 / F4 для переключення вперед-назад і F6 для відключення. Введіть вихід на фактично кінцеві термінали назавжди.
disownдля досягнення цього. Дивіться відповідь @ bassgey
disownі якщо потрібно просто Ctrl-z, то bgщоб дістати його з активного терміналу і на другий план. Тоді disown.
Гей, поки я погодився, що екран - це найефективніший варіант. Ви можете використовувати vncserver, а потім запустити процес на ньому.
Крім того, якщо ваш єдиний інтерес полягає в тому, щоб процес запущений і вам не потрібно було повертати контроль над ним, і вкрай важливо, щоб ви не знали, що вам потрібно буде закрити сеанс, і процес вже запущений, вам не пощастить, якщо ви використовували bash як оболонку
Спочатку потрібно надіслати процес у фоновий режим, ввівши Ctrl + Z, а потім bg% 1 (число залежить від номера завдання, зазвичай це 1, але ви можете легко витягнути список за допомогою командних завдань)
Нарешті, виклик команди відключення (слідом за виконанням завдання ... те саме, що і команда bg)
Це видалить відносини батько-дитина між вашою оболонкою та процесом у фоновому режимі, не даючи їй загинути після припинення роботи оболонки.
screen, було поставлено питання про подію після входу в систему, як тримати процеси, вже після входу в систему, але перед їх запуском. Чудова відповідь, Хорхе, ти мені справді допоміг! :)
bg(без %1) досить часто, оскільки за замовчуванням є поточна робота
Для одного сценарію оболонки, який я працюю протягом тривалого періоду часу, я ввійду в систему та запускаю процес у фоновому режимі, використовуючи "&".
Приклад:
/path/to/my/script &
Я вийшов із системи та відключив сеанс SSH. Коли я ввійду через деякий час, сценарій все ще виконується як підтверджений постійним збором даних із сценарію.
&якщо ви виходите з системи і входите до свого сеансу SSH, процес все ще буде запущений, проте ви не зможете побачити вихід цього процесу (якщо ваш скрипт повторить щось, що вам не побачить його, але якщо він напише файл, файл буде там)
Ви повинні переглянути екран GNU і подивитися, чи допомагає він вам. Залежно від того, як вам потрібна програма для запуску в режимі реального часу, це може спричинити більше проблем, ніж вирішує, але принаймні це дозволить вам відновити сеанс так, ніби ви ніколи не виходили з нього.
Як користуватись :
screenдля першого запуску, прокручуйте вступні повідомлення, вам слід вручити термінал.screen -rдля відновлення сеансу. Ви можете мати декілька відокремлених сеансів на екрані одночасно; у цьому випадку вам буде показаний список доступних сеансів.Існує багато інших варіантів, наприклад розділені екрани, а також усі ярлики повністю настроюються.
Найпростіша відповідь ...
ctrl + z призупинить запущену програму
"bg" запустить його у фоновому режимі
disownабо nohup), це зазвичай не триматиме процес після закінчення сеансу SSH.
Хоча всі кажуть, що використовувати 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якщо це не вийшло з цілковитої параної. Може хтось може пролити трохи світла на те, як поводиться Баш за замовчуванням? Можливо, деякі системні адміністратори змінюють за замовчуванням великі оболонки, щоб утримати процеси своїх користувачів від перевантаження системи?
На жаль, припинене сеанс SSH може призвести до відключення tmux або екрана. Це відбувається тому systemd, що припинять будь-які дочірні процеси після виходу з сеансу.
Ви можете змінити цей параметр у вашому logind.conf( /etc/systemd/logind.conf):
KillUserProcesses=no
Завдяки відповіді на https://unix.stackexchange.com/questions/490267 .
Замість :
cmd options;
Додати перед nohup:
nohup cmd options &
Тоді ви зможете побачити контур консолі:
tail -f nohup.out