如何知道一个进程是否已经启动但是在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)是你的朋友。

要找到您的应用,您可以尝试一些想法:

  • 查看/proc文件系统
  • 运行ps命令
  • 尝试killall appname -0并检查返回码