Saya menggali melalui berbagai sumber, tetapi tidak dapat menemukan deskripsi yang baik tentang anatomi menuai anak. Ini adalah kasus sederhana dari apa yang ingin saya pahami.
$ cat <( sleep 100 & wait ) &
[1] 14247
$ ps ax -O pgid | grep $$
12126 12126 S pts/17 00:00:00 bash
14248 12126 S pts/17 00:00:00 bash
14249 12126 S pts/17 00:00:00 sleep 100
14251 14250 S pts/17 00:00:00 grep --color=auto 12126
$ kill -2 14248
$ ps ax -O pgid | grep $$
12126 12126 S pts/17 00:00:00 bash
14248 12126 Z pts/17 00:00:00 [bash] <defunct>
14249 12126 S pts/17 00:00:00 sleep 100
14255 14254 S pts/17 00:00:00 grep --color=auto 12126
Mengapa zombie menunggu anak itu?
Bisakah Anda menjelaskan yang ini? Apakah saya perlu tahu C dan membaca kode sumber Bash untuk mendapatkan pemahaman yang lebih luas tentang ini atau apakah ada dokumentasi? Saya sudah berkonsultasi:
- berbagai tautan di situs ini dan Stack Overflow
- Linux Command Line oleh W. Shotts
man bash
- Manual Referensi Bash (dalam dokumen kode sumber Bash)
- Bash Guide for Beginners @ tldp.org
- Panduan Script Bash Lanjutan
GNU bash, versi 4.3.42 (1) -release (x86_64-pc-linux-gnu)
Linux 4.4.0-31-generic # 50-Ubuntu SMP Rab 13 Jul 00:07:12 UTC 2016 x86_64 x86_64 x86_64 GNU / Linux
Jawaban:
Zombie tidak menunggu anaknya. Seperti proses zombie lainnya, ia tetap ada sampai orang tuanya mengumpulkannya.
Anda harus menampilkan semua proses yang terlibat untuk memahami apa yang terjadi, dan melihat PPID juga. Gunakan baris perintah ini:
Induk dari proses yang Anda bunuh adalah
cat
. Apa yang terjadi adalah bahwa bash menjalankan perintah latar belakangcat <( sleep 100 & wait )
dalam sebuah subkulit. Karena satu-satunya hal yang dilakukan subkulit ini adalah mengatur beberapa pengalihan dan kemudian menjalankan perintah eksternal, subkulit ini diganti oleh perintah eksternal. Inilah rundown:fork
untuk mengeksekusi perintah latar belakangcat <( sleep 100 & wait )
pada anak (14247).pipe
untuk membuat pipa, lalufork
untuk membuat anak untuk menjalankan proses substitusisleep 100 & wait
.fork
untuk berjalansleep 100
di latar belakang. Karena cucu tidak interaktif, proses latar belakang tidak berjalan dalam kelompok proses yang terpisah. Kemudian cucu menunggu untuksleep
keluar.setpgid
(itu adalah pekerjaan latar belakang di shell interaktif sehingga mendapat kelompok proses sendiri), kemudianexecve
dijalankancat
. (Saya sedikit terkejut bahwa proses substitusi tidak terjadi pada kelompok proses latar belakang.)cat
, yang tidak tahu apa-apa tentang proses anak dan tidak memiliki panggilan bisniswait
. Karena orang tua cucu tidak memetiknya, cucu tetap tinggal sebagai zombie.cat
keluar - baik karena Anda membunuhnya, atau karenasleep
kembali dan menutup pipa sehinggacat
melihat akhir inputnya. Pada saat itu, orang tua zombie mati, jadi zombie dikumpulkan oleh init dan init menuai itu.Jika Anda mengubah perintah ke
kemudian
cat
berjalan dalam proses terpisah, bukan pada anak dari proses bash asli: anak pertama harus tinggal di belakang untuk berjalanecho done
. Dalam hal ini, jika Anda membunuh cucu, itu tidak tetap sebagai zombie, karena anak (yang masih menjalankan bash pada saat itu) menuai itu.Lihat juga Bagaimana linux menangani proses zombie dan Bisakah zombie memiliki anak yatim? Akankah anak-anak yatim diganggu dengan menuai zombie?
sumber
cat
) tidak menunggu 14248 (menunggusleep
)? Apakah ada ingatan tentang siapa yang menunggu siapa, yang hilang oleh anak (14247) dan bash asli (14246) tidak, atau mungkin daftar sinyal seperti SIGCHLD tentang siapa yang harus dipanggil dan 14247 (sekarang berjalanbash
) berhenti berlangganan dari dengan salam untuk 14248?wait
pada anaknya, yaitu menuai itu. Saya bisa melihat bagaimana ini membingungkan, saya telah menghapus kalimat yang bahkan tidak pada titik yang tepat secara kronologis berbicara. Informasi bahwa suatu proses telah mati, pergi ke orang tua proses itu, suatu proses tidak dapat "berlangganan" untuk menerima informasi tentang kematian beberapa proses lainnya.Zombie tidak menunggu anak itu. Sebaliknya, zombie adalah dengan proses yang sudah meninggal (dengan sendiri, atau dibunuh - seperti dalam contoh Anda), memiliki kode, data dan tumpukan deallocated, dan sekarang hanya berisi kode keluar nya, menunggu induknya untuk memanggil
wait(2)
untuk mengambilnya (dan akhirnya membersihkan entri proses dengan lengkap dari tabel proses)Dalam contoh Anda, ketika tidur selesai (atau terbunuh), orang tua akan membaca status keluar, dan menuai zombie. Lihat yang disebutkan di atas
wait(2)
untuk detailnya.sumber