linux - 如何实现一个流程来监督另一个流程?

标签 linux bash unix

目前在我的工作场所,我有一个名为“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/

相关文章:

node.js - 向同一个 bash 进程发送多个命令

bash - 别名命令更改到最新目录

java - 如何在安装了 Apache Tomcat 的 UNIX 机器上安装 PHP

linux - 脚本检测变量作为命令

regex - 如何使用 sed 删除带空格的行?

linux - Bash:重定向来自 2 个源的输入?

bash - Ubuntu Hadoop 找不到 JAVA_HOME

bash - 如何 ${@ : -1} expand to last argument

Javascript - moment.js 日期对象到 unix 字符串

linux - 从 Linux 客户端使用 WCF 服务