当您提交作业时,pbs_server 将您的任务传递给 pbs_mom。 pbs_mom process/daemon 实际上在执行节点上执行你的脚本。它
"creates a new session as identical user."
这意味着调用一个shell。您在脚本顶部使用 shebang 标记您选择的 shell:#!/bin/bash)。
很明显,pbs_mom 将进程(shell)PID 存储在某处以终止作业并监视作业(shell 进程)是否已完成。
UPD。基于@Dmitri Chubarov 评论:pbs_mom 在调用fork() 后将子shell PID 存储在内存中,并在.TK 文件中,该文件位于torque 安装目录下:@987654334 @ 在我的系统上。
以十进制模式转储文件内部(<job_number>、<queue_name> 应该是您自己的值):
$ hexdump -d /var/spool/torque/mom_priv/jobs/<job_number>.<queue_name>.TK
已经披露,在我的扭矩实现中,它存储在适当的位置
00000890 + offset 4*2 = 00000898(它是.TK文件中PID的第一个字节的十六进制值),长度为2字节。
例如,对于 shell PID=27110 我有:
0000890 00001 00000 00001 00000 27110 00000 00000 00000
让我们从.TK 文件中恢复PID:
$ hexdump -s 2200 -n 2 -d /var/spool/torque/mom_priv/jobs/<job_number>.<queue_name>.TK | tr -s ' ' | cut -s -d' ' -f 2
27110
这样你就找到了子shell PID。
现在,在执行节点上监视进程列表并找到子进程的名称(getcpid 函数是 posted earlier on SO 的轻微修改版本):
function getcpid() {
cpids=`pgrep -P $1|xargs`
for cpid in $cpids;
do
ps -p "$cpid" -o comm=
getcpid $cpid
done
}
终于,
getcpid <your_PID>
为您提供子进程的名称(注意,会有一些垃圾行,例如任务编号)。 这样你最终会知道执行节点上当前正在运行什么命令。
当然,对于每一个被监控的任务,你应该在做完后获取执行节点上的PID和进程名
ssh <your node>
您可以自动检索<node/proc+node/proc+...> 格式的节点名称(进一步处理以获得裸节点名称):
qstat -n <job number> | awk '{print $NF}' | grep <pattern_for_your_node_names>
注意:
PID 方法是可靠的,而且我相信是最优的。
按名称搜索更糟糕,只有当您在脚本中调用不同的命令并且没有用户在节点上执行相同的软件时,它才会为您提供明确的结果。
ssh <your node>
ps aux | grep matlab
你会知道matlab 是否运行。