3

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

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

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

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

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

欢迎任何关于通过 Perl 或 LSF 选项前进的建议。

谢谢, 阿布舍克

4

1 回答 1

3

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

这可能是您的问题。LSF 按进程组跟踪“在作业中运行的进程”。如果您的作业生成了一个在其自己的进程组中运行的进程(例如通过守护进程自身),那么它本质上是一个不受 LSF 控制的失控进程——管理它成为您的作业的责任。

有关参考,请参阅此处的“分离进程”部分。

至于选项:

  1. 我认为 cgroups 跟踪功能在很多情况下都有帮助,您可以询问您的管理员是否在 lsf.conf 中进行了设置LSF_PROCESS_TRACKINGLSF_LINUX_CGROUP_ACCT如果不是,那么你可以让他设置它们,看看这是否对你的情况有帮助(你需要确保你运行的主机支持 cgroups)。在 9.1.2 中,此功能在安装时打开,因此由于各种原因(例如,您的主机没有启用 cgroups),此选项实际上可能对您没有帮助。
  2. 自行管理许可流程。如果您可以从脚本中找到许可进程的 PID/PGID,则可以使用或类似方法在脚本中为/perl安装自定义信号处理程序,并在脚本通过. 见这里SIGCONTSIGSTPsigtrapbkill
于 2016-01-14T13:16:11.273 回答