Как эмуляторы терминала могут убивать своих детей после получения SIGKILL?

12

Из того, что я понимаю, SIGKILL не может быть пойман. Это может означать, что процесс не успевает убить своих детей, прежде чем ОС уничтожит его. Это можно продемонстрировать с помощью сценария оболочки.

#! /bin/bash

trap : SIGTERM SIGINT SIGKILL # SIGKILL is pointless.

mplayer video.avi

Убивая его с помощью SIGKILL, вы запускаете mplayer.

$ kill -9 $pid

Но при использовании эмулятора терминала (xterm, Terminal, ...) его дети убиваются вместе с ним. Как это возможно?

$ mplayer

И убей это

$ kill -9 $terminal_pid

И mplayer сходит с корабля. Эмуляторы терминала как-то ловят SIGKILL или здесь работает другая сила?

Кевин Кокс
источник

Ответы:

11

Начавшийся процесс xtermбудет лидером сеанса управления терминалом.

Когда терминал отключается, этот процесс автоматически получает сигнал SIGHUP (за которым следует SIGCONT). Это отправляется ядром аналогичным образом, что процессы получают SIGINT, когда вы нажимаете CTRL-C.

Кроме того, оболочка может отправить SIGHUP некоторым своим дочерним элементам при выходе (см. disownНекоторые оболочки, чтобы отключить это)

Стефан Шазелас
источник
1
Для получения информации о сессиях и их лидерах: unix.stackexchange.com/questions/18166/… .
Кевин Кокс
+1 за disownчто очень полезно.
математика
1

Ваш вопрос отвечает сам на себя, это происходит потому, что эти процессы выполняются как дочерние элементы под эмулятором терминала. Таким образом, вы убиваете эмулятор терминала и при этом убиваете все дочерние процессы (так как дочерние процессы выполняются в той же группе процессов, что и эмулятор управляющего терминала).

Смотрите, например, следующее:

csb@darwin[~]$ ps fauwx | grep -A6 "xfce4-terminal" | awk '{ for (i = 2; i <= 9; i++) $i="" ; print $0 }' 
csb         0:32 xfce4-terminal --geometry=271x65 --display :0.0 --role=Terminal-0x1340050-2606-1351620352 --show-menubar --show-borders --hide-toolbars --working-directory /home/csb --tab --working-directory /home/csb
csb         0:00 \_ gnome-pty-helper
csb         0:00 \_ bash
csb         0:00 | 
                  \_ ssh [redacted]
csb         0:00 \_ bash
csb         0:00 \_ ps fauwx
csb         0:00 \_ grep --color=auto -A6 xfce4-terminal
csb         0:00 \_ awk { for (i = 2; i <= 9; i++) $i="" ; print $0 }

Все эти процессы выполняются в процессах «xfce4-терминал», поэтому, если я уничтожу этот процесс, он автоматически уничтожит все дочерние процессы в группе процессов ... так же, как, например, выход из окна эмулятора терминала будет обязательно убей мое SSH соединение.

Такие программы, как оболочки, создают новые группы процессов, обычно помещая связанные дочерние процессы в группу. Каждая работа - это группа процессов. Вне ядра оболочка манипулирует заданием, отправляя сигналы группе процессов задания с помощью системного вызова killpg, который доставляет сигнал всем процессам в группе процессов.

Чарльз Бойд
источник
3
-1: убийство родителя не приводит к гибели детей.
Camh
2
Такие программы, как оболочки, создают новые группы процессов, обычно помещая связанные дочерние процессы в группу. Каждая работа - это группа процессов. Вне ядра оболочка манипулирует заданием, отправляя сигналы группе процессов задания с помощью системного вызова killpg, который доставляет сигнал всем процессам в группе процессов.
Чарльз Бойд
2
@CharlesBoyd Этот комментарий должен быть частью вашего ответа.
Иордания
4
@CharlesBoyd: добавьте это к своему ответу, и я дам вам +1 вместо -1. Ваш ответ в настоящее время выглядит так, как будто дочерние процессы уничтожаются при уничтожении родительского процесса (кстати, его сеансовый, а не групповой процесс).
Camh
@CharlesBoyd Я понимаю это, но суть вопроса в том, как он «манипулирует [] работой, посылая сигналы», когда получает SIGKILL. Я не вижу возможности использовать killpgсистемный вызов в этот момент.
Кевин Кокс
0

Во-первых, я не могу воспроизвести mplayer, выживший после уничтожения терминала, используя xterm.

Причина, по которой он умирает, в том, что он получает SIGHUP от смерти своего родителя.

перекати-поле
источник
Я никогда не говорил, что это сделал, я говорил, что он умирает, но выживает, когда это в сценарии, и это убито.
Кевин Кокс
Не выживает в сценарии, для меня.
камышовое