【问题标题】:How do I find the current process running on a particular PBS job如何找到在特定 PBS 作业上运行的当前进程
【发布时间】:2015-12-22 01:23:04
【问题描述】:

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

脚本中的命令示例

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

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

【问题讨论】:

    标签: linux pbs qsub torque


    【解决方案1】:

    当您提交作业时,pbs_server 将您的任务传递给 pbs_mompbs_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 &lt;your node&gt;

    您可以自动检索&lt;node/proc+node/proc+...&gt; 格式的节点名称(进一步处理以获得裸节点名称):

    qstat -n <job number> | awk '{print $NF}' | grep <pattern_for_your_node_names>
    

    注意: PID 方法是可靠的,而且我相信是最优的。 按名称搜索更糟糕,只有当您在脚本中调用不同的命令并且没有用户在节点上执行相同的软件时,它才会为您提供明确的结果。

    ssh <your node>
    ps aux | grep matlab
    

    你会知道matlab 是否运行。

    【讨论】:

    • pbs_mom调用的shell是pbs_mom的子进程。 pbs_mom 只是调用 fork() 将 shell 的 PID 返回到父进程。为了在pbs_mom 重启后存活,Torque 还将包含二进制形式的 PID 的作业数据存储在位于mom_priv 目录中的每个作业文件中。 *.TK 文件包含可用于终止作业的 PID。
    【解决方案2】:

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

    `

    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的输出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      相关资源
      最近更新 更多