我有一个大型应用程序(用 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)以停止跟踪。