将 SIGTSTP 信号传递给 LSF 作业中的所有进程

Pass SIGTSTP signal to all processes in a job in LSF

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

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

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

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

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

欢迎通过 Perl 或 LSF 选项提出任何建议。

谢谢, 阿布舍克

I tried to see if I can send the signals to the Perl script's own PGID, but the license process starts its own process group.

这可能就是您的问题所在。 LSF 按进程组跟踪 "processes running within the job"。如果您的工作产生了一个在其自己的进程组中运行的进程(比如通过守护进程本身),那么它本质上是一个不受 LSF 控制的失控进程——管理它成为您工作的责任。

有关参考,请参阅 "Detached processes" here 部分。

至于选项:

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