Подпроцессы bash/gnome-terminal не завершаются (CentOS/RHEL)

Подпроцессы bash/gnome-terminal не завершаются (CentOS/RHEL)

сегодня я наблюдал нечто, что, вероятно, имеет простое объяснение, но было совершенно неожиданным с моей стороны: я использую CentOS (и RHEL, который ведет себя так же). Я открываю bash в терминале и запускаю любой подпроцесс, например gedit. Окно открывается, отлично. Когда я делаю 'ps', я вижу, что gedit имеет bash в качестве родительского процесса, который сам имеет gnome-terminal в качестве своего родителя. Когда я затем останавливаю bash, я ожидал бы, что все дочерние процессы также остановятся. Но gedit продолжает работать, и родительский процесс изменился на 1 (init)!

Я пробовал не останавливать оболочку изящно, а убить ее жестко, результат тот же. Он пытался убить терминал вместо оболочки, результат тот же. Только когда я закрываю терминал, нажимая кнопку X, то gedit тоже закрывается.

Я не ожидал такого поведения. Запустив gedit с nohup, я бы не удивился, но даже без nohup... почему он остаётся жив?

Может кто-то сможет пролить свет и знает, что там происходит. Спасибо заранее!

решение1

Такие программы, как gedit, gvim, google-chrome и многие другие, автоматически переходят в фоновый режим. Это позволяет вам набирать

gedit /home/msw/ul-answer

Отобразите новое окно и верните приглашение оболочки. Это неплохой выбор дизайна, и обычно есть возможность переопределить его. Команды gedit -wи gvim --noforkне отсоединятся от управляющего терминала и не вернут вам приглашение оболочки.

Для того, чтобы программа сама ушла в фоновый режим, она разветвляется, а затем родитель завершается. Это сделает ваш обычный экземпляр gedit дочерним для init (PPID == 1) почти сразу после того, как вы его введете.

Другие программы, такие как mplayer или calibre, не переходят в фоновый режим автоматически, либо потому, что они не используются часто, либо потому, что им нравится выгружать отладочную информацию на свой управляющий терминал.

добавлена ​​странность:

Потратив немного времени на тестирование и просмотр вывода strace и т. п., gedit, похоже, не переходит в фоновый режим автоматически. То, что я сказал о gvim, все еще актуально, и уже давно пора спать, так что я оставлю это пока как есть.

решение2

Когда вы закрываете окно терминала, ядро ​​отправляетПОДПИШИТЕСЬсигнал bash. Затем bash отправляет SIGHUP каждому заданию, поэтому он завершает gedit с помощью SIGHUP.

Когда вы выходите из bash, набрав exitили Ctrl+ Dили убив его с помощью SIGKILL, эмулятор терминала замечает, что его дочерний процесс завершился, и закрывает окно. Gedit не затрагивается.

Связанный контент