如何知道如果一个程序已经启动,但在Linux中坠毁(How to know if a process

2019-10-29 07:27发布

考虑以下情况: - 我使用Linux操作系统。 我怀疑我的应用程序崩溃。 我没有启用核心转储。 有日志中没有的信息。

我怎么能肯定的是,在系统重新启动后,我的应用程序已经开始,但是现在它没有运行,因为它已坠毁。

我的应用程序被配置为服务,用C / C ++。

从某种意义上说: 我怎样才能得到所有自启动系统已执行的过程/服务名称? 它甚至有可能?

我知道,我可以启用日志记录,然后重新启动过程中得到的崩溃。

Answer 1:

标准的做法是让你的守护进程(/var/run/$NAME.pid),在这里您可以找到它的进程ID,而不必手动解析进程树一个pid文件。 然后,您可以检查进程的状态,或者让你的守护进程的信号(通常SIGHUP)响应,并报告其状态。 这是一个好主意,以确保该PID仍属于你的进程也是如此,而最简单的方法是检查/ proc / $ PID / CMDLINE。

附录:如果你只使用新的Fedora或Ubuntu,你的init系统是新贵 ,其中有监控和内置触发功能。

作为@ EMG-2指出,BSD进程记帐是可用的,但我不认为这是造成这种情况的正确的做法。



Answer 2:

此功能包含在Linux内核。 这就是所谓的: BSD进程记账。



Answer 3:

我建议你写的,你开始了某种日志文件,一个私人其中一个得到的覆盖每个启动或通过一个事实syslogd的 。

此外,让你知道什么时候它崩溃,你可以登录时间戳心跳。



Answer 4:

你也许可以做一个诱饵,即应用程序或shell脚本,就要到真正的应用程序的包装,但增加了一些日志记录,如“应用程序启动”。 然后你改变你原有的应用程序的名称,并给原来的名字你的诱饵。



Answer 5:

作为JimB提到,你有守护写一个PID文件。 如果它运行或不通过发送的信号时,可以告诉0 ,要么通过对kill(2)系统调用或kill(1)程序。 与PID存在的返回状态会告诉你该进程是否与否。



Answer 6:

守护程序应始终:1)使用GETPID()(男子GETPID)或你的语言等效的命令写当前运行实例的进程/var/run/$NAME.pid。 2)写入一个日志文件的标准来/var/log/$NAME.log(较大的日志文件应被分解成.0.log为当前与.X.log.gz运行日志沿着其他日志,其中X是具有一个数更低的是更近)3)/应当/有一个LSB​​兼容的运行脚本接受至少开始停止状态,并重新启动标志。 状态可以用来检查守护进程是否正在运行。



Answer 7:

我不知道让已执行的所有进程名的标准方法。 有可能是一个不过用的方式来做到这一点SystemTap的 。

如果你只是想监视你的过程中,我会推荐叉,而不是分离和daemonizing后使用waitid(男子2等待)。



Answer 8:

如果您的应用程序崩溃,这不是从“你的应用程序从未启动过”区分的,除非你的应用程序在系统日志中写道。 syslog(3)是你的朋友。

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

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


文章来源: How to know if a process had been started but crashed in Linux