我正在尝试编写一个脚本来提供进程诊断。我已使用qsub向作业调度服务器提交了一个脚本。我可以很容易地找到作业被发送到的节点。但我希望能够找到当前正在运行的进程。 即。我在提交的脚本中有一个不同命令的列表,如何找到当前正在运行的命令以及传递给它的参数?
脚本中的命令示例
matlab -nodesktop -nosplash -r "display('here'),quit"
python runsomethings.py
我想看看节点当前是在执行第一行还是第二行。
答案 0 :(得分:2)
提交作业时,pbs_server
会将您的任务传递给pbs_mom
。 pbs_mom
进程/守护进程实际上在执行节点上执行您的脚本。它
这意味着 调用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