将SIGTSTP信号传递给LSF

时间:2016-01-14 11:24:57

标签: perl lsf

问题陈述简而言之:LSF中是否有办法将SIGCONT / SIGTSTP信号传递给作业中运行的所有进程?

我有一个在LSF(版本9.1.2)上运行的Perl包装器脚本,并在与Perl脚本相同的LSF机器上启动一个工具(Source not available)。

该工具启动2个流程,一个用于许可证管理,另一个用于执行实际工作。它还支持一个选项,即向两个进程发送SIGSTSP / SIGCONT将释放/重新获取许可证(这是我希望实现的)。

运行bkill -s SIGCONT <JOB_ID>仅恢复工具流程而不是许可证流程,这是一个问题。

我试着看看我是否可以将信号发送到Perl脚本自己的PGID,但许可证流程启动了自己的流程组。

欢迎任何有关推进Perl或LSF选项的建议。

谢谢, 阿布舍克巴克

1 个答案:

答案 0 :(得分:3)

  

我试着看看是否可以将信号发送到Perl脚本自己的PGID ,但许可证流程会启动自己的流程组。

这可能就是你的问题。 LSF通过进程组跟踪“作业内运行的进程”。如果你的工作产生了一个在自己的进程组中运行的进程(例如通过daemonizing自身),那么它本质上是LSF无法控制的失控进程 - 管理它就成了你的工作。

供参考,请参阅“分离的流程”here部分。

至于选项:

  1. 我认为cgroups跟踪功能在很多情况下有帮助,您可以询问管理员是否在lsf.conf中设置了LSF_PROCESS_TRACKINGLSF_LINUX_CGROUP_ACCT。如果不是,那么你可以让他设置它们,看看这对你的情况是否有帮助(你需要确保你运行的主机支持cgroup)。在9.1.2中,此功能在安装时打开,因此该选项实际上可能由于各种原因而无法帮助您(例如,您的主机没有启用cgroup)。
  2. 自行管理许可证流程。如果您可以在perl脚本中找到许可证流程的PID / PGID,则可以使用SIGCONT在脚本中为SIGSTP / sigtrap安装自定义信号处理程序等等,并在脚本通过bkill收到许可证时,将它们转发给许可证流程。见here