作者:ayo | 来源:互联网 | 2023-05-19 01:36
请考虑以下情况:–我正在使用Linux。我怀疑我的应用程序崩溃了。我没有启用核心转储。日志中没有信息。我怎么能确定,在系统重启后我的应用程序启动了,但现在它没有运行,因为它已经崩溃
请考虑以下情况: – 我正在使用Linux。 我怀疑我的应用程序崩溃了。 我没有启用核心转储。 日志中没有信息。
我怎么能确定,在系统重启后我的应用程序启动了,但现在它没有运行,因为它已经崩溃了。
我的应用程序配置为服务,用C / C ++编写。
在某种程度上: 如何获得自系统启动以来执行的所有进程/服务名称? 它甚至可能吗?
我知道,我可以启用日志记录并再次启动进程以获取崩溃。
标准做法是为您的守护程序(/var/run/$NAME.pid)提供一个pid文件,您可以在其中找到其进程ID,而无需手动解析进程树。 然后,您可以检查该进程的状态,或让您的守护进程响应信号(通常为SIGHUP),并报告其状态。 确保此pid仍然属于您的进程是一个好主意,最简单的方法是检查/ proc / $ PID / cmdline。
附录:如果你只使用较新的fedora或ubuntu,你的init系统是新手 ,它具有内置的监控和触发function。
正如@ emg-2所指出的那样,BSD进程会计是可用的,但我不认为这是这种情况的正确方法。
此function包含在Linux内核中。 它被称为: BSD流程会计。
我建议您写下这样一个事实,即您开始使用某种日志文件,或者是在每次启动时被覆盖的私有文件,或者是通过syslogd覆盖的日志文件。
此外,您可以记录时间戳心跳,以便确切知道崩溃的时间。
你可能可以制作一个诱饵,即一个应用程序或shell脚本,它只是真正的应用程序的包装器,但添加了一些日志记录,如“应用程序启动”。 然后,您更改原始应用程序的名称,并将原始名称提供给您的诱饵。
正如JimB所提到的,你让守护进程写了一个PID文件。 您可以通过kill(2)
系统调用或kill(1)
程序向它发送信号0
来判断它是否正在运行。 返回状态将告诉您是否存在具有该PID的进程。
守护进程应始终:1)使用getpid()(man getpid)或您的语言的等效命令将当前运行的实例的进程写入/var/run/$NAME.pid。 2)将标准日志文件写入/var/log/$NAME.log(对于当前运行的日志,较大的日志文件应分解为.0.log,对于其他日志,应将.X.log.gz分解为其中,其中X为更低版本更新)3)/应该/有一个LSB兼容的运行脚本至少接受启动停止状态和重启标志。 状态可用于检查守护程序是否正在运行。
我不知道获取已执行的所有进程名称的标准方法; 然而,使用SystemTap可能有一种方法。
如果您只是想监视您的进程,我建议在fork之后使用waitid(man 2 wait)而不是分离和守护进程。
如果您的应用程序已崩溃,则无法区分“您的应用程序从未启动过”,除非您的应用程序在系统日志中写入。 syslog(3)
是你的朋友。
要找到您的应用,您可以尝试一些想法:
以上就是c/c++开发分享如何知道一个进程是否已经启动但是在Linux中崩溃了相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(编程笔记)。