Как закрыть терминал, не убивая его детей (без запуска `screen`)?

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

Графическое дерево Gnome выглядит так:

gnome-terminal bash some-boring-process 

Могу ли я «отсоединить» bash от gnome-terminal (или отсоединить some-boring-process от bash и перенаправить его выход где-нибудь)? Если я просто убью gnome-terminal , bash будет убит до всех его подпроцессов

Если в вашем текущем сеансе bash запущен some-boring-process :

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

Это не делает ничего для перенаправления вывода – вы должны думать об этом, когда запускаете свой скучный процесс. [Изменить] Кажется, есть способ перенаправить его https://gist.github.com/782263

Но серьезно, посмотрите в экран. У меня есть оболочки на удаленном сервере, которые работают в течение нескольких месяцев.

Это именно то, для чего были созданы экран и tmux . Вы запускаете оболочку внутри сеанса screen / tmux, и вы можете отключить / снова подключиться по желанию. Вы также можете иметь несколько сеансов оболочки внутри одного gnome-терминала.

screen , tmux или dtach (возможно, с dvtm ) – все это прекрасно, но если это то, о чем вы не думали использовать один из них, вы можете использовать nohup .

Если вы хотите продолжать взаимодействовать с дочерним процессом, а не просто осваивать его и продолжать его работу, на самом деле есть программа под названием retty, которая является доказательством концепции для «кражи» процесса из текущего tty и повторного подключения к нему текущий.

Это, однако, делает некоторые ужасные вещи, в том числе вставляя какой-то код сборки в стек повторно подключенного приложения. И этот код не был обновлен для x86_64.

Есть еще одна программа, которая использует, может быть, более эффективный подход, замораживая процесс в пользовательском пространстве в файл, из которого он может быть позже восстановлен (возможно, на другом tty.) Это криопид , и этот проект тоже, кажется, остановился в а также не работает с современной Linux, поскольку код стоит. Ах хорошо.

Просто подумал, что это должно быть здесь для полноты. Если вы не против прибегать к ужасным вуду, это находится в пределах возможностей – по крайней мере, теоретической возможности.

Если я запустил что-то, что я хочу закончить, независимо от того, что (не до перезагрузки системы), я использую nohup и запускаю его в фоновом режиме. В отличие от экрана и т. П. Вы не можете подключаться к процессам. Однако, переназначая перенаправление в другом месте, любой вывод можно найти в nohup.out .

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

Вы можете заставить процесс (PID) не получать сигнал HUP при завершении сеанса терминала. Используйте следующую команду:

 nohup -p PID 

Этот сценарий отвлекает дочерний процесс от родителя и назначает его процессу 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