轨道[sh]用于调试目的?

轨道[sh]用于调试目的?

我有一个大型应用程序(用 C++ 编写),它不时生成失效的进程。我知道该应用程序内部大量使用 Linux 命令。我需要知道那些已失效的 sh 进程调用了哪些 linux 命令,是否可以找到?或者,当我的应用程序调用 Linux 命令时,是否可以设置 Linux 并获取某种日志?

谢谢。
卢克

答案1

维基百科:

失效进程是已完成执行但在进程表中仍有条目的进程。仍然需要此条目来允许启动(现在是僵尸)进程的进程读取其退出状态。

你的C++代码正在调用吗wait()?如果通过调用wait()已失效的进程获得退出状态,则该进程应该消失。

答案2

popen这个大型应用程序通过 shell 使用或类似的库函数发出外部命令。中间 shell 保持为僵尸(“失效进程”),因为应用程序没有调用wait“收割”它的孩子。请注意,僵尸进程是完全无害的(无论 B 级电影会让您相信什么);它们消耗的唯一资源是进程表中的条目。

您可以通过运行来跟踪应用程序执行的命令

strace -f -s99999 -v -eexecve -o big-application.strace ./big-application

这可能会稍微减慢你的程序。您可以在进程的生命周期内打开和关闭跟踪:要开始跟踪,请运行

strace -f -s99999 -v -eexecve -o big-application.strace -p 12345

其中 12345 是您要跟踪的进程 ID。终止strace进程(例如按Ctrl+ C)以停止跟踪。

相关内容