在 的输出中ps aux
,我可以看到这个过程很好:
# ps aux | grep diff
root 7787 28.7 0.0 9368 4516 pts/3 D+ 13:56 20:33 diff -qr mnt/mnt/md/ mnt/mnt2/
root 13130 0.0 0.0 6144 876 pts/4 S+ 15:07 0:00 grep diff
但pidof
声称找不到任何东西:
# pidof diff
# echo $?
1
查看手册页,没有关于丢失进程时该怎么办的信息,pidof 有。/proc/7787/exe
是一个符号链接/usr/bin/diff
,/usr/bin/diff
它本身是一个常规文件和一个 ELF。根据手册页,这应该匹配。
经过一些调查
strace
,似乎pidof
也检查了进程的状态。我的diff
进程D
大部分时间都处于状态,这意味着它正在等待 I/O 很多。有了这些知识,我跑pidof
了很多次(大约在 3 秒内):它确实“有时”返回它,似乎证实了
pidof
只返回未处于D
状态的进程的怀疑。检查
pidof
in的源代码src/killall5.c
(使用 获得apt source sysvinit-utils
),答案在第 599 行:在 sysvinit 2.96 及更高版本中,
pidof -z
将包括处于磁盘 I/O ('D') 或僵尸 ('Z') 状态的进程。