我有一些程序要在监督系统下运行。编程停止时,将发送SIGTERM
信号,并在超时后发送SIGKILL
信号。我的问题是程序在SIGTERM
上不正常地退出 –它使用默认处理程序。
更改监督系统或程序都不是我的选择。我考虑编写某种包装程序,该程序将派生程序,捕获SIGTERM
并请求在其中正常退出,这类似于此伪C语言:
// wrapper.c
setsid();
signal(SIGTERM, &make_child_exit_gracefully);
pid = fork() ? waitpid(pid) : exec("/sbin/naughty-program");
该方法的问题在于,如果naughty-program
出于某种原因拒绝了正常退出的请求,则来自监管系统的SIGKILL
将终止包装程序,但是程序将只收到SIGHUP
,它可以忽视。这样,我可以以通配符naughty-program
结尾,将其重新设置为PID1而不是被杀死。
有更可靠的解决方案吗?是否有可能以某种方式将非平凡的代码注入子进程以用作信号处理程序?是否可以将naughty-program
映射到包装器的地址空间并将控制权传递给它?
理想地,我正在寻找POSIX兼容的解决方案,尽管特定于Linux也是可以的。