Mungkin melihat proses yang mati?

13

Dalam man ps, itu jelas menyatakan berbagai kondisi proses di Linux.

D    Uninterruptible sleep (usually IO)
R    Running or runnable (on run queue)
S    Interruptible sleep (waiting for an event to complete)
T    Stopped, either by a job control signal or because it is being traced.
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    Defunct ("zombie") process, terminated but not reaped by its parent.

Bahkan jika Xini adalah keadaan proses, itu tidak boleh dilihat. Tetapi apakah itu benar? Apakah ada cara teoretis untuk melihatnya sebagai keadaan pada suatu proses? Atau benar-benar 100% mustahil?

xeor
sumber
2
Penggunaan seharusnya dan fakta bahwa itu ada di halaman manual menyiratkan bahwa sebenarnya mungkin untuk melihatnya. Saya tidak tahu bagaimana atau kapan.
terdon

Jawaban:

7

Saya mengambil sedikit menyelam ke kernel Linux, tanpa pengetahuan tentang cara kerjanya di inti dalamnya, atau pengetahuan C besar. Jadi tolong baik-baik saja dengan teori ini :)

The DEADstate didefinisikan https://github.com/torvalds/linux/blob/master/fs/proc/array.c#L141 dan digunakan di https://github.com/torvalds/linux/blob/master/fs /exec.c#L974 untuk memberikan status pengembalian saja. Jadi satu-satunya cara yang bisa dilihat adalah jika Anda memeriksa keadaan proses sebelum sekitar https://github.com/torvalds/linux/blob/master/fs/exec.c#L986 (atau nanti di mana pun fungsi ini dipanggil) dari..).

Jika Anda mencoba untuk mematikan proses yang mati itu akan diurus dan diabaikan di https://github.com/torvalds/linux/blob/master/kernel/signal.c#L1363

Jadi secara teori ... saya pikir jawabannya adalah ya. X sebagai keadaan dapat dilihat dalam teori, tetapi mungkin belum pernah dalam kehidupan nyata ..

Harap perbaiki saya jika / di mana saya salah .. Saya tidak yakin tentang ini sama sekali ..

xeor
sumber
2
Saya bisa melihatnya denganuntil sleep 0.4 & perl -e '$p = shift; while (1) {open A, "</proc/$p/stat" or last; $_=<A>; print}' $! | grep X; do :; done
Stéphane Chazelas
Berikut adalah proses (output dari /proc/.../stat) terlihat seperti; 4603 (sleep) X 0 -1 -1 0 -1 4202508 0 0 0 0 0 0 0 0 20 0 0 0 175042279 0 0 0 0 0 0 0 0 0 0 0 0 18446744071579306375 0 0 17 0 0 0 0 0 0.. Pertanyaan dijawab. X itu mungkin! Terima kasih!
xeor
1

Berikut bukti yang baru saja kita temui di sistem live:

$ sudo ps axf -O wchan
31103 -      R ?        00:00:00 /bin/bash /usr/local/bin/monitorcron taskA
31104 exit   X ?        00:00:00  \_ [su]
slm
sumber
Apakah Anda ingat jika prosesnya hilang pada saat Anda berlari berikutnya ps?
Hitechcomputergeek