目前在我的工作场所,我有一个名为"批处理启动器的脚本" (用bash
编写),用于监督批处理的执行,记录其输出并处理批处理的返回代码。目前通过{"批量启动器"中的env
电话完成此操作:
env $BATCH_ENV $BATCH_NAME $BATCH_OPTIONS >> $OUT_FILE 2>&1
几天前,用perl
编写的一个批次对PGID进行了一次杀戮调用(以消除所有分叉的孩子),并且因为"批量发射器"与它产生的任何东西共享PGID,它也被这个电话杀死了。
我应该如何正确确保任何PGID终止呼叫将离开"批量启动器"完好无损,并报告说它正在监督的过程被杀了?
到目前为止,我已经听说过setsid -w
命令来解决此问题,但我无法将其与env
调用结合使用。
答案 0 :(得分:0)
我犯了一个愚蠢的错误,就是咨询在线文档,而不是在我目前工作的系统中调用man
。 setsid
表示setsid
支持标记,日期为2014年7月。我的手册页的日期是1993年11月(我在RHEL 5上工作),并且没有任何标记支持。
-w
试图将env $BATCH_ENV setsid $BATCH_NAME $BATCH_OPTIONS >> $OUT_FILE 2>&1
标志解析为文件名,导致 execvp:没有此类文件或目录错误。一旦我删除了旗帜,一切正常。 end命令现在看起来像:
$BATCH_NAME
现在从"批量启动器"分配SID和PGID等于$BATCH_NAME
的PID,并且SIGTERM
的PGID上的kill调用离开"批处理启动器"未受影响,现在很高兴地报告返回状态143({{1}})。