Bagaimana Emulator Terminal Dapat Membunuh Anak-Anak Mereka Setelah Menerima SIGKILL?

12

Dari apa yang saya mengerti, SIGKILL tidak dapat ditangkap. Ini akan menyiratkan bahwa suatu proses tidak punya waktu untuk membunuh anak-anak itu sebelum OS menghancurkannya. Ini dapat ditunjukkan dengan skrip shell.

#! /bin/bash

trap : SIGTERM SIGINT SIGKILL # SIGKILL is pointless.

mplayer video.avi

Membunuhnya dengan SIGKILL membuat mplayer berjalan.

$ kill -9 $pid

Tetapi ketika menggunakan emulator terminal (xterm, Terminal, ...) anak-anak terbunuh bersama dengannya. Bagaimana ini mungkin?

$ mplayer

Dan bunuh itu:

$ kill -9 $terminal_pid

Dan mplayer turun dengan kapal. Apakah emulator terminal entah bagaimana menangkap SIGKILL atau adakah kekuatan lain yang bekerja di sini?

Kevin Cox
sumber

Jawaban:

11

Proses dimulai oleh xterm akan menjadi pemimpin sesi dalam mengendalikan terminal.

Ketika terminal pergi, proses itu secara otomatis menerima sinyal SIGHUP (diikuti oleh SIGCONT). Ini dikirim oleh kernel dengan cara yang sama dengan proses menerima SIGINT ketika Anda menekan CTRL-C.

Selain itu, sebuah shell dapat mengirimkan SIGHUP ke beberapa anaknya saat keluar (lihat disowndi beberapa shell untuk menonaktifkannya)

Stéphane Chazelas
sumber
1
Untuk info tentang sesi dan pemimpin sesi: unix.stackexchange.com/questions/18166/… .
Kevin Cox
+1 disownyang sangat berguna.
matematika
1

Pertanyaan Anda menjawab sendiri, ini terjadi karena proses ini berjalan sebagai anak-anak di bawah terminal emulator. Jadi Anda membunuh emulator terminal, dan dengan melakukannya, bunuh semua proses anak-anak (karena anak-anak berjalan di bawah kelompok proses yang sama dengan emulator terminal pengendali).

Lihat, misalnya, berikut ini:

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 }

Semua proses ini berjalan di bawah proses 'xfce4-terminal', jadi jika saya membunuh proses itu maka akan membunuh secara otomatis semua proses anak dalam kelompok proses ... dengan cara yang sama, misalnya, yang keluar dari jendela terminal emulator akan tentu membunuh koneksi SSH saya.

Program seperti cangkang membuat grup proses baru, biasanya menempatkan proses anak terkait ke dalam grup. Setiap pekerjaan adalah kelompok proses. Di luar kernel, shell memanipulasi pekerjaan dengan mengirimkan sinyal ke grup proses pekerjaan dengan panggilan sistem killpg, yang mengirimkan sinyal ke semua proses dalam grup proses.

Charles Boyd
sumber
3
-1: Membunuh orang tua tidak menyebabkan anak-anak terbunuh.
camh
2
Program seperti cangkang membuat grup proses baru, biasanya menempatkan proses anak terkait ke dalam grup. Setiap pekerjaan adalah kelompok proses. Di luar kernel, shell memanipulasi pekerjaan dengan mengirimkan sinyal ke grup proses pekerjaan dengan panggilan sistem killpg, yang mengirimkan sinyal ke semua proses dalam grup proses.
Charles Boyd
2
@CharlesBoyd Komentar itu harus menjadi bagian dari jawaban Anda.
jordanm
4
@CharlesBoyd: Tambahkan itu ke jawaban Anda dan saya akan memberi Anda +1, bukan -1. Jawaban Anda saat ini berbunyi seolah-olah proses anak terbunuh ketika proses induk dibunuh (BTW, berdasarkan sesi, bukan berbasis grup proses).
camh
@CharlesBoyd Saya mengerti itu, tapi inti dari pertanyaannya adalah bagaimana cara "memanipulasi [] pekerjaan dengan mengirimkan sinyal" ketika menerima SIGKILL. Saya tidak melihat cara untuk itu menggunakan killpgsystem call pada saat itu.
Kevin Cox
0

Pertama, saya tidak bisa mereproduksi mplayer yang selamat dari terminal terbunuh, menggunakan xterm.

Alasannya mati, adalah bahwa ia mendapat SIGHUP dari kematian orang tuanya.

tumbleweed
sumber
Saya tidak pernah mengatakan itu, saya mengatakan bahwa itu mati tetapi bertahan ketika ada dalam naskah dan itu terbunuh.
Kevin Cox
Tidak bertahan dalam naskah, bagi saya.
tumbleweed