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

标签 linux pbs qsub torque

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

脚本中的命令示例

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

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

最佳答案

当您提交工作时,pbs_server将您的任务传递给 pbs_mom . pbs_mom进程/守护进程实际上在执行节点上执行你的脚本。它

"creates a new session as identical user."

这意味着调用 shell。您可以在脚本顶部专门化 shell,用 shebang 标记您的选择:#!/bin/bash ).

很明显, pbs_mom存储过程(外壳)PID 在某处终止作业并监视作业(shell 进程)是否已完成。


UPD。基于@Dmitri Chubarov 评论:pbs_mom存储子外壳 PID调用 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

这样你就找到了 subshel​​l 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运行。

关于linux - 如何找到在特定 PBS 作业上运行的当前进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34407091/

相关文章:

linux - Perl 帮助 : Can't call method "display" on an undefined value

linux - linux进程的内存利用率

linux - 将 unix 用户添加到 postfix 邮件日志

c - 在 Linux 中使用写入系统调用写入数据时出现问题

parallel-processing - 如何在一个 PBS 作业提交中运行多个命令

c++ - 如果可执行文件在两个或多个节点上运行,为什么无法看到环境变量?

hpc - 同时执行多个 qsub 命令

python - 在集群上运行通过 qsub 从 Python 提交的作业。是否有意义?

python - 集群上多处理模块的行为

c++ - libtorque - 我如何包含 PBSD_status 函数?