如何找到在特定PBS作业上运行的当前进程

时间:2015-12-22 01:23:04

标签: linux pbs qsub torque

我正在尝试编写一个脚本来提供进程诊断。我已使用qsub向作业调度服务器提交了一个脚本。我可以很容易地找到作业被发送到的节点。但我希望能够找到当前正在运行的进程。 即。我在提交的脚本中有一个不同命令的列表,如何找到当前正在运行的命令以及传递给它的参数?

脚本中的命令示例

matlab -nodesktop -nosplash -r "display('here'),quit"
python runsomethings.py

我想看看节点当前是在执行第一行还是第二行。

2 个答案:

答案 0 :(得分:2)

提交作业时,pbs_server会将您的任务传递给pbs_mompbs_mom进程/守护进程实际上在执行节点上执行您的脚本。它

  

"creates a new session as identical user."

这意味着 调用shell 。您可以使用shebang专门设置脚本顶部的shell:#!/bin/bash)。

很明显, pbs_mom存储进程(shell)PID 某处以杀死作业并监视作业(shell进程) ) 完成了。

<强> UPD。基于@Dmitri Chubarov评论pbs_mom在调用PID之后在内部存储子shell fork(),并在.TK文件中我的系统上的torque安装目录:/var/spool/torque/mom_priv/jobs

以十进制模式转储文件内部结构(<job_number><queue_name>应该是您自己的值):

$ hexdump -d /var/spool/torque/mom_priv/jobs/<job_number>.<queue_name>.TK

已经披露,在我的扭矩实施中,它存储在适当的位置 00000890 + offset 4*2 = 00000898(它是PID文件中.TK的第一个字节的十六进制值),长度为2个字节。 例如,对于shell PID=27110,我有:

0000890   00001   00000   00001   00000   27110   00000   00000   00000

让我们从PID文件中恢复.TK

$ 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是否会运行。

答案 1 :(得分:0)

简单而优雅的方法是打印到日志文件

`

ARGS=" $A $B $test "
echo "running MATLAB now with args: $ARGS" >> $LOGFILE
matlab -nodesktop -nosplash -r "display('here'),quit"

PYARGS="$X $Y"
echo "running Python now with args: $ARGS" >> $LOGFILE
python runsomethings.py

`

使用tail -f $LOGFILE

监控$ LOGFILE的输出