我有一个不稳定的程序,随机崩溃,我可以使用bash脚本来保持运行,但有没有办法监控它的状态?不是通过民意调查,而是通过事件驱动。
并且可选的问题是,如果监视进程不是它的父进程,这仍然可能吗?
答案 0 :(得分:1)
是的,它仍然有可能。如果您想编写自己的应用程序来执行此操作,则必须使用ptrace
。它允许您作为调试器附加到进程并等待某些事件。我描述了在我的博客上使用ptrace
。在这里,您可以通过一些示例了解更多相关信息:http://purecode.pl/blog/?tag=ptrace
答案 1 :(得分:1)
你可以编写一个简单的包装器来解析和执行崩溃过程,并在它获得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;
}
}
您不需要任何花哨的东西,只需了解子和父进程如何通过信号进行交互的基本知识。
请注意,由于我直接处理了信号,所以已经有一段时间了,所以请仔细检查那里的代码是否正确。
答案 2 :(得分:0)
从您的问题中不清楚您是否正在尝试确保程序继续运行,或者您是否正在尝试调试它。
如果您要让它继续运行,请尝试Monit:http://mmonit.com/monit/
答案 3 :(得分:0)
您可以尝试使用inotify或类似服务并注意删除/ proc / PID吗?
答案 4 :(得分:0)
如果使用bash脚本启动进程,则 监视其状态:进程退出后脚本的执行将恢复,并获取退出代码。这是事件驱动的。
至于监控非子女程序,Yob和user1442158已经提出了合理的建议。