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?
sumber
disown
yang sangat berguna.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:
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.
sumber
killpg
system call pada saat itu.Pertama, saya tidak bisa mereproduksi mplayer yang selamat dari terminal terbunuh, menggunakan
xterm
.Alasannya mati, adalah bahwa ia mendapat SIGHUP dari kematian orang tuanya.
sumber