目前在我的工作场所,我有一个名为“batch launcher”的脚本(用 bash
编写),它应该监督批处理的执行,记录它们的输出并处理批处理的返回码.目前这是通过此“批量启动器”中的 env
调用完成的:
env $BATCH_ENV $BATCH_NAME $BATCH_OPTIONS >> $OUT_FILE 2>&1
几天前,用 perl
编写的批处理之一对 PGID 进行了 kill 调用(以消除所有 fork 的 child ),并且由于“批处理启动器”与它生成的任何东西共享 PGID,它得到了也被这个电话杀死了。
我应该如何正确地确保任何 PGID 终止调用都会使“批处理启动器”完好无损,并报告它正在监督的进程已被终止?
到目前为止,我听说过 setsid -w
命令可以解决这个问题,但我无法将它与 env
调用结合使用。
最佳答案
我犯了一个愚蠢的错误,就是查阅在线文档而不是在我当前工作的系统中调用 man
。这page声明 setsid
支持标志,日期为 2014 年 7 月。我的手册页日期为 1993 年 11 月(我在 RHEL 5 上工作),并且没有任何标志支持。
发生的事情是 setsid
试图将 -w
标志解析为文件名,导致 execvp: No such file or directory错误。一旦我删除了标志,一切正常。结束命令现在看起来像:
env $BATCH_ENV setsid $BATCH_NAME $BATCH_OPTIONS >> $OUT_FILE 2>&1
现在从“批量启动器”启动的任何东西都被分配了等于 $BATCH_NAME
的 PID 的 SID 和 PGID,并且终止对 $BATCH_NAME
的 PGID 的调用留下“批处理启动器”不受影响,它现在愉快地报告返回状态 143 (SIGTERM
)。
关于linux - 如何实现一个流程来监督另一个流程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40362415/