Як можуть емулятори терміналів вбити своїх дітей після отримання 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-terminal', тож якщо я вбиваю цей процес, він автоматично знищить усі дочірні процеси в групі процесів ... таким же чином, як, наприклад, що вихід із вікна емулятора термінала обов'язково вбити моє SSH-з'єднання.

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


3
-1: Вбивство батьків не призводить до вбивства дітей.
camh

2
Такі програми, як оболонки, створюють нові групи процесів, зазвичай розміщуючи пов'язані дочірні процеси в групі. Кожне завдання - це процесна група. Поза ядром оболонка маніпулює завданням, надсилаючи сигнали до групи процесів завдання за допомогою системного виклику killpg, який подає сигнал до всіх процесів у групі процесів.
Чарльз Бойд

2
@CharlesBoyd Цей коментар повинен бути частиною вашої відповіді.
Йорданм

4
@CharlesBoyd: Додайте це до своєї відповіді, і я дам вам +1 замість -1. На даний момент ваша відповідь звучить так, ніби дочірні процеси вбиваються, коли вбивається батьківський процес (BTW, його сеанс, а не груповий процес).
camh

@CharlesBoyd Я це розумію, але суть питання полягає в тому, як він "маніпулює [] роботою, надсилаючи сигнали", коли отримує SIGKILL. Я не бачу способу використовувати killpgсистемний виклик у той момент.
Кевін Кокс

0

По-перше, я не можу відтворити програвача, який пережив термінальний вбивство, використовуючи xterm.

Причина, в якій вона помирає, полягає в тому, що вона отримує САЙТ від смерті батьків.


Я ніколи цього не говорив, я говорив, що він гине, але виживає, коли це за сценарієм, і вбивається.
Кевін Кокс

Для мене не виживає сценарій.
переплетення
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.