首页 > 解决方案 > 如何检测为什么进程在 Linux 中以编程方式终止

问题描述

进程因以下三个原因之一终止:它们已到达执行结束(标称情况),它们包含未捕获的异常(同步崩溃),或者它们收到了一些它们未处理的信号(异步崩溃)。在程序设计中,我们可以检测至少检测其中每一个的方法(例如,catch 语句、信号处理程序等)。

假设我想设计一个可以监控另一个程序在 Linux 中执行的程序。我可以通过注意到它的 PID 消失来轻松判断程序是否终止/proc,但我不知道为什么。有没有办法观察目标程序以确定终止原因?

标签: linuxprocess

解决方案


主要限制是您需要的详细信息量。在操作系统级别,您基本上只能计算退出代码或终止进程的信号。

根据您的限制,有多种选择:

  1. wait- 允许快速通知(阻止呼叫或信号),但仅适用于直系子女。

  2. ptrace,直接(相当棘手)或通过strace命令;它有局限性,例如,单个进程一次只能被一个进程跟踪,但它允许指定要监视的系统调用列表,因此它不需要像默认调用 strace 那样慢。

  3. BSD 进程会计。通常需要root权限才能访问,并且绝对需要他们打开它(它是全局的)。一旦它运行,您可以有效地观察一个文件,该文件为每个完成过程增加一个条目,包括退出代码/信号,或者以编程方式(ac_exitcodeacct 结构中的字段)或通过lastcomm命令(参见http://man7.org/linux /man-pages/man1/lastcomm.1.html)。


推荐阅读