Скажімо, я запускаю купу процесів із сеансу 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