可能看到死程序吗?


13

在中man ps,它明确指出了进程在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.

即使X是过程状态,也永远不应该看到它。但这是正确的吗?是否有理论上的方式将其视为流程中的状态?还是完全100%不可能?


2
使用应当以及手册页中应有的事实意味着实际上有可能看到它。我不知道如何或何时。
terdon

Answers:


7

我深入研究了Linux内核,没有任何关于Linux内核如何工作的知识,也没有任何C方面的知识。因此,请配合这个理论:)

DEAD状态定义为https://github.com/torvalds/linux/blob/master/fs/proc/array.c#L141,并在https://github.com/torvalds/linux/blob/master/fs中使用/exec.c#L974仅给出返回状态。因此,唯一可以看到的方法是,如果您在https://github.com/torvalds/linux/blob/master/fs/exec.c#L986之前(或以后在调用此函数的任何地方)检查进程状态,从..)。

如果您尝试杀死死进程,它将在https://github.com/torvalds/linux/blob/master/kernel/signal.c#L1363处得到照顾并被忽略。

所以从理论上讲...我认为答案是肯定的。从理论上可以看出X是一种状态,但现实生活中可能从未有过。

如果/我错了,请更正我。.我完全不确定。


2
我可以看到它until sleep 0.4 & perl -e '$p = shift; while (1) {open A, "</proc/$p/stat" or last; $_=<A>; print}' $! | grep X; do :; done
斯特凡Chazelas

这是过程(/proc/.../stat的输出)的样子;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..回答的问题。X是可能的!谢谢!
xeor 2014年

1

这是我们在实时系统上遇到的一个证据:

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

您还记得下一次运行时该过程是否消失了ps吗?
Hitechcomputergeek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.