ps 和 top 的输出不一致

ps 和 top 的输出不一致

我有一个过程,比如script.pl这里是的),它似乎会一直停留在输出中ps auxw | grep script.pl,有时当负载很重时它会停留几分钟。另一个进程每秒调用此脚本 5-10 次(此进程对脚本进行非阻塞调用,如下所示:)System(/some/path/script.pl &)

起初我担心这个脚本由于某种原因无法及时完成,从而拖慢了其他事情。然而,这个脚本所做的只是通过 TCP 套接字向另一个框写入一条消息。

这就是事情变得奇怪的地方。1)我可以通过查看另一个框上的日志来验证这个套接字操作(脚本所做的唯一事情)是否完成 - 它会立即按时收到消息。2)即使我script.plps输出中看到许多(看似已完成的)实例,但如果我执行类似操作,我看不到相应的条目top -n 1 | grep script.pl- 这似乎表明没有使用任何资源;事实上,在这个输出中script.pl根本没有实例。script.pl

那么最后,Perl 解释器是否存在任何已知问题ps,可能导致完成的 Perl 脚本在输出中徘徊ps,但没有top输出?

谢谢!

编辑:我将 top 命令调用更改为:top -n 1 -u script_pl_user | grep script.pl。现在,进程在两个位置均等显示。但是,在中top,它显示 CPU 使用率为 0.0%,没有或非常非常小的内存使用量。为什么 script.pl 仍然存在,即使其操作已验证完成?

答案1

这是由于 ps 和 top 的机制所致。

Top 只是按 PID 汇总使用情况,而 Perl 中的系统调用本质上使用操作系统的本机 fork(),它会创建一个子进程。子进程具有与父进程相同的 PID。ps 枚举所有正在运行的进程。例如,请注意,Apache 也是如此。如果您执行 Top 并找到 Apache,您将只看到一个条目,但如果您执行 ps aux 并在其中找到 Apache,则会有多个具有相同 PID 的条目。

实际上,top 旨在查找程序的总资源使用情况,因此您不想看到每个子进程使用的数量,而 ps 则用于详细查找正在运行的程序,因此您想查看所有子进程。

相关内容