Ölü süreçleri görmek mümkün mü?


13

İçinde man ps, bir sürecin Linux üzerinde sahip olabileceği farklı durumları açıkça belirtir.

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.

XBir süreç hali olsa bile , asla görülmemelidir. Ama bu doğru mu? Bunu bir süreçte devlet olarak görmenin teorik bir yolu var mı? Yoksa tamamen% 100 imkansız mı?


2
Kullanımı meli ve kılavuz sayfasında bulunuyor olması, onu görmek için aslında mümkün olduğunu ima. Nasıl ya da ne zaman olduğu hakkında hiçbir fikrim yok.
terdon

Yanıtlar:


7

İç çekirdeğinde nasıl çalıştığı veya herhangi bir büyük C bilgisi hakkında bilgi sahibi olmadan Linux çekirdeğine küçük bir dalış yaptım. Bu yüzden lütfen bu teoriyle iyi olun :)

DEADDurum tanımlanmıştır https://github.com/torvalds/linux/blob/master/fs/proc/array.c#L141 ve kullanılır https://github.com/torvalds/linux/blob/master/fs /exec.c#L974 yalnızca bir dönüş durumu vermek için. Görülebilmenin tek yolu, işlem durumunu https://github.com/torvalds/linux/blob/master/fs/exec.c#L986 (veya daha sonra bu işlevin çağrıldığı her yerde) dan ..).

Ölü bir süreci öldürmeye çalışırsanız, https://github.com/torvalds/linux/blob/master/kernel/signal.c#L1363 adresinde halledilir ve yok sayılır.

Teoride ... Bence cevap evet. X bir devlet olarak teoride görülebilir, ama muhtemelen gerçek hayatta hiç bulunamamıştır ..

Lütfen yanlış olduğumda / nerede olduğumu düzeltin .. Bundan hiç emin değilim ..


2
Ben ile bunu görebilirsinizuntil 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

İşlem (/proc/.../stat çıktısı) şöyle görünür; 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.. Soru cevaplandı. X mümkün! Teşekkürler!
xeor

1

İşte canlı bir sistemde karşılaştığımızın kanıtı:

$ sudo ps axf -O wchan
31103 -      R ?        00:00:00 /bin/bash /usr/local/bin/monitorcron taskA
31104 exit   X ?        00:00:00  \_ [su]

Bir sonraki çalıştırışınızda sürecin geçip geçmediğini hatırlıyor musunuz ps?
Hitechcomputergeek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.