linux - 如何检测为什么进程在 Linux 中以编程方式终止
问题描述
进程因以下三个原因之一终止:它们已到达执行结束(标称情况),它们包含未捕获的异常(同步崩溃),或者它们收到了一些它们未处理的信号(异步崩溃)。在程序设计中,我们可以检测至少检测其中每一个的方法(例如,catch 语句、信号处理程序等)。
假设我想设计一个可以监控另一个程序在 Linux 中执行的程序。我可以通过注意到它的 PID 消失来轻松判断程序是否终止/proc
,但我不知道为什么。有没有办法观察目标程序以确定终止原因?
解决方案
主要限制是您需要的详细信息量。在操作系统级别,您基本上只能计算退出代码或终止进程的信号。
根据您的限制,有多种选择:
wait
- 允许快速通知(阻止呼叫或信号),但仅适用于直系子女。ptrace
,直接(相当棘手)或通过strace
命令;它有局限性,例如,单个进程一次只能被一个进程跟踪,但它允许指定要监视的系统调用列表,因此它不需要像默认调用 strace 那样慢。BSD 进程会计。通常需要root权限才能访问,并且绝对需要他们打开它(它是全局的)。一旦它运行,您可以有效地观察一个文件,该文件为每个完成过程增加一个条目,包括退出代码/信号,或者以编程方式(
ac_exitcode
acct 结构中的字段)或通过lastcomm
命令(参见http://man7.org/linux /man-pages/man1/lastcomm.1.html)。
推荐阅读
- rest - ActiveMQ Artemis REST 集成抛出异常
- python - 我得到'ValueError:没有为任何变量提供渐变:'
- design-patterns - 装饰器与责任链 DP
- functional-programming - 函数式编程原则与函数式编程范式?
- mysql - 如何在SELECT字段中同时使用distinct、count和sum?
- android - 在我的联系人列表中自动保存联系人
- php - 如何显示图像名称字符串中的第一个图像名称
- aws-elasticsearch - 更新 AWS Elasticsearch 集群设置
- r - 保持从 fread 丢弃的行
- haskell - Haskell 多参数类(模板类型类)