Из того, что я понимаю, 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 или здесь работает другая сила?
источник
disown
что очень полезно.Ваш вопрос отвечает сам на себя, это происходит потому, что эти процессы выполняются как дочерние элементы под эмулятором терминала. Таким образом, вы убиваете эмулятор терминала и при этом убиваете все дочерние процессы (так как дочерние процессы выполняются в той же группе процессов, что и эмулятор управляющего терминала).
Смотрите, например, следующее:
Все эти процессы выполняются в процессах «xfce4-терминал», поэтому, если я уничтожу этот процесс, он автоматически уничтожит все дочерние процессы в группе процессов ... так же, как, например, выход из окна эмулятора терминала будет обязательно убей мое SSH соединение.
Такие программы, как оболочки, создают новые группы процессов, обычно помещая связанные дочерние процессы в группу. Каждая работа - это группа процессов. Вне ядра оболочка манипулирует заданием, отправляя сигналы группе процессов задания с помощью системного вызова killpg, который доставляет сигнал всем процессам в группе процессов.
источник
killpg
системный вызов в этот момент.Во-первых, я не могу воспроизвести mplayer, выживший после уничтожения терминала, используя
xterm
.Причина, по которой он умирает, в том, что он получает SIGHUP от смерти своего родителя.
источник