我遇到了一个奇怪的问题,其中一个ps -o args -p <pid>
命令偶尔无法找到有问题的进程,即使它肯定在有问题的服务器上运行。有问题的进程是用于启动一些 Java 应用程序的长时间运行的包装器脚本。
该问题的“异常”发生似乎总是在清晨发生,因此有一些证据表明它与相关服务器上的磁盘负载有关,因为它们当时负载相当大,但是通过运行ps
in在一个紧密的循环中提出问题,我最终可以复制这个问题 - 每运行几百次左右我就会得到一个错误。
通过运行以下 bash 脚本,我设法为失败和成功的运行生成了 strace 输出:
while [ $? == 0 ] ; do strace -o fail.out ps -o args -p <pid> >/dev/null ; done ; strace -o good.out ps -o args -p <pid>
Run Code Online (Sandbox Code Playgroud)
输出从比较fail.out
和good.out
,我可以看到getdents
失败不知何故在运行系统调用返回比对过程系统的实际数量要少很多(与〜1100相比〜500级)
grep getdents good.out
getdents(5, /* 1174 entries */, 32768) = 32760
getdents(5, /* 31 entries */, 32768) = 992
getdents(5, /* 0 entries */, …
Run Code Online (Sandbox Code Playgroud)