Як я можу закрити термінал, не вбиваючи його дітей (не запускаючи `екран 'спочатку)?


35

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

Кінцеве дерево Gnome виглядає так:

gnome-terminal
    bash
        some-boring-process

Чи можу я «відірватися» bashвід gnome-terminal(або відірватися some-boring-processвід bash і перенаправити його вихід кудись)? Якщо я просто вб'ю gnome-terminal, bashбуде вбито за всіма його підпроцесами


Відповіді:


48

Якщо some-boring-processпрацює у вашому поточному сеансі bash:

  1. зупини це, ctrl-zщоб дати вам підказку
  2. поставити його на другий план с bg
  3. відзначте номер завдання або скористайтеся jobsкомандою
  4. відірвіть процес від цього баш-сеансу disown -h %1(замініть фактичний номер завдання там).

Це не робить нічого для перенаправлення виводу - ви повинні це думати, коли запускаєте свій нудний процес. [Редагувати] Здається, є спосіб перенаправити його https://gist.github.com/782263

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


Дякую. Я вибрав вашу відповідь, тому що це був єдиний, хто відповідає на питання (мова йшла про вже запущений процес). Я вже використовую screenіноді, хоча у нього є свої проблеми, і я не хочу використовувати його для кожного баш-сеансу в своєму житті
valya

Ви використовуєте його не для кожного баш-сеансу, але для кожної віддаленої машини, де ви проводите багато часу.
Глен Джекман

Я взяв на себе сміливість додати інформацію про перенаправлення виводу, будь ласка, перегляньте його!
валя

[root @ server ~] # bg -bash: bg: поточний: немає такої роботи
Muhammad Dyas Yaskur

Чому я потрапив bash: bg: current: no such job?
Мухаммад Діяс Яскур

10

Саме для цього створено екран та tmux . Ви запускаєте оболонку всередині сеансу екран / tmux, і ви можете відключити / підключити знову за бажанням. Ви також можете мати кілька сеансів оболонки, що працюють в одному gnome-терміналі.


Дякую, але, як я коментував прийняту відповідь: 1. питання стосувалося вже запущеного процесу. 2. У неї screenє проблеми, і я не відчуваю, як використовувати його для кожного баш-сеансу в моєму житті
Валя

6

screen, tmuxабо dtach(можливо, з dvtm) все для цього чудово, але якщо це щось, де ви не думали використовувати один із них, можливо, ви зможете скористатися nohup.


Дякую, але, як я коментував прийняту відповідь: 1. питання стосувалося вже запущеного процесу. 2. screenмає свої проблеми, і мені не подобається використовувати його для кожного баш-сеансу в моєму житті
Валя

@valya Радий, що ти знайшов рішення. Однак для того, щоб було зрозуміло, nohupчи працює це запускаючий процес, використовуючи -pопцію (за наявності).
Хенк Гей

@Hank Gay: Я не можу побачити -pпараметр на nohupсторінках man; на якій системі ви працюєте?
Мікель

@Mikel Перш ніж я навчився переставати хвилюватися і любити це tmux, я використав цю -pопцію на коробці Solaris. У мене також є розпливчасті спогади про те, щоб це робити на віночковому вікні CentOS (можливо, він zshмає вбудований файл, який його підтримує?), Але я не можу знайти жодних документів з цього приводу.
Хенк Гей

@Hank Гей: Ні , bashні zshв моїй системі Ubuntu Linux надають nohup.
Мікель

4

Якщо ви хочете продовжувати взаємодіяти з дочірнім процесом, а не просто фонувати його і продовжувати його, насправді існує програма, яка називається retty яка є доказом концепції "викрадення" процесу з його поточного tty і повторного приєднання до нього поточний.

Однак це робить деякі жахливі речі, включаючи наклеювання деякого асемблерного коду на стек повторно доданої програми. І цей код не було оновлено для x86_64.

Є ще одна програма, яка використовує, можливо, кращий підхід, заморожуючи процес у користувальницькому просторі до файлу, з якого він згодом може бути відновлений (можливо, на іншій tty.) Це cryopid , і цей проект теж, здається, зупинився в фаза підтвердження концепції, і не працює з сучасним Linux, як код стоїть. Ну добре.

Просто подумав, що це повинно бути тут для повноти. Якщо ви не проти вдатися до жахливого вуду, це в межах можливості - принаймні, теоретичної можливості.


1
це нагадує мені gist.github.com/782263 ... о, ця суть, здається, теж відповідає на моє запитання
valya

2

Якщо я запускаю щось, що я хочу закінчити, незважаючи ні на що (не маючи перезавантаження системи), я використовую nohupі запускаю це у фоновому режимі. На відміну від екрана тощо, ви не можете повторно приєднатись до процесів. Однак перенаправлення баррінгу в іншому місці будь-якого результату можна знайти nohup.out.

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

EDIT: Якщо ви вже запустили процес, ви можете disownзапобігти HUPнадсиланню сигналу, коли процес закривається.


Дякую, але, як я коментував прийняту відповідь: 1. питання стосувалося вже запущеного процесу. 2. У неї screenє проблеми, і я не відчуваю, як використовувати його для кожного баш-сеансу в моєму житті
Валя

@valya Я бачив посилання на відключення запущеного процесу від програмної групи. Я не знаю жодних інструментів для цього. Цей інструмент, ймовірно, також повинен буде перенаправляти std канали вводу-виводу. Я думаю, що, можливо, я змусив його колись працювати, але вирішив, що Нохуп був простішим.
BillThor

1

Ви можете змусити процес (PID) не отримувати сигнал HUP, коли термінальний сеанс закінчується. Використовуйте таку команду:

nohup -p PID

nohup: invalid option -- 'p'. У якій версії nohupви працюєте за якою системою?
Антон

Я в основному використовую Solaris і AIX. Для Linux слід зареєструватися в команді відключення.
тоні

Так, -pу Linux немає варіантів, тому ця відповідь є специфічною для Solaris та AIX. Приємно знати, проте
Сергій Колодяжний

1

Цей скрипт відокремлює дочірній процес від батьківського і призначає його до процесу init :

toDetach=$1

./$toDetach & # Runs the process - script on background

disown -h %$(jobs -l | grep $(ps -A | grep $toDetach | cut --delimiter=' ' -f1) | cut --delimiter=' ' -f1 | tr -d '[]+') # and then disowns it from parents process
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.