我有一个不稳定的程序,它一直随机崩溃,我可以使用 bash 脚本来保持它运行,但是有没有办法监控它的状态?不是通过轮询,而是事件驱动。
还有一个可选问题,如果监控进程不是它的父进程怎么办,这还有可能吗?
是的,它仍然是可能的。如果您想编写自己的应用程序来执行此操作,您必须使用ptrace
. 它允许您作为调试器附加到进程并等待某些事件。ptrace
我在我的博客上描述了使用。在这里,您可以通过一些示例了解更多信息:http ://purecode.pl/blog/?tag=ptrace
您可以编写一个简单的包装器,它分叉并执行崩溃的进程,并在它获得 SIGCHLD 时唤醒并重新开始;下面的概念代码:
volatile sig_atomic_t gotchld = 0;
void
sigchld_handler(int sig)
{
if (sig == SIGCHLD)
gotchld = 1;
}
signal(SIGCHLD, sigchld_handler);
for (;;) {
switch ((pid = fork()) {
case -1:
err(1, "fork");
case 0:
exec_my_crashy_program_here();
errx(1, "came back from exec!"); /* paranoia */
default:
printf("sleeping for pid %u\n", pid);
while (!gotchld)
select(0, NULL, NULL, NULL, NULL); /* sleep forever waiting for signal */
/* possibly do fancy stuff with the wait() family of functions */
gotchild = 0;
continue;
}
}
您不需要任何花哨的东西,只需了解子进程和父进程如何通过信号交互的基本知识。
还请考虑到我已经有一段时间没有直接处理信号了,所以请仔细检查那里的代码是否正确。
从您的问题中不清楚您是否正在尝试确保程序继续运行,或者您是否正在尝试调试它。
如果您想保持它运行,请尝试 Monit: http: //mmonit.com/monit/
您可以尝试 inotify 或类似的服务并观察 /proc/PID 是否被删除?
如果您使用 bash 脚本启动进程,它会监视其状态:在进程退出后继续执行脚本,并获取退出代码。那是事件驱动的。
至于监控非子进程,Yob和user1442158已经给出了合理的建议。