如何列出集群上分配给用户的所有进程

如何列出集群上分配给用户的所有进程

我们大学里有一个由 SLURM 控制的集群。问题是,我观察到有时某些资源没有被实现,即使它们没有出现在命令中squeue。例如,我看到其中一个节点上的很多 CPU 都分配给了我,尽管我scancel几天前已经杀死了分配的资源!我想找到他们并杀死他们。

在我的本地计算机上,我已经生成了公钥和私钥 ssh 密钥,因此现在我可以使用, , ...ssh-keygen登录到任何一台机器,但这些节点的名称不是按顺序排列的。如果登录到这些节点之一并运行以下结果:ssh foossh [email protected]ssh [email protected]sinfo

PARTITION   AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug          up   infinite      3    mix baz[080-081,083]
debug          up   infinite      2  alloc grault,baz082
debug          up   infinite     13   idle baz[061-070],corge,bar,quux
gpu_p100       up   infinite      1    mix baz080
gpu_titan-x    up   infinite      2    mix baz[081,083]
gpu_titan-x    up   infinite      1  alloc baz082
r730           up   infinite      1    mix baz080
t630           up   infinite      2    mix baz[081,083]
t630           up   infinite      1  alloc baz082
r930           up   infinite      1  alloc grault
m610           up   infinite     10   idle baz[061-070]
r720           up   infinite      1   idle corge
r815           up   infinite      1   idle bar
sm1u           up   infinite      1   idle quux
main*          up   infinite      3    mix baz[080-081,083]
main*          up   infinite      2  alloc grault,baz082
main*          up   infinite     12   idle baz[061-070],bar,quux

其中baz[081-083]指的是 3 个节点baz081,baz082baz083。否,如果我 ssh 到这些节点中的任何一个,我可以通过以下方式列出分配给特定用户的所有进程:

ps -A | grep user1

但这需要很多时间。我怎样才能自动化这个过程:

  1. 登录到其中一个节点
  2. 跑步sinfo
  3. sinfo提取信息并从命令的最后一列中创建一个字符串列表
  4. 查找特定用户的所有正在运行的进程user1并打印到终端

我如何编写一个脚本(最好与 Cmder/ConEmu 兼容)来自动执行这些步骤。

答案1

这将尝试登录所有节点并打印 user1 的进程:

    for hostList in $(sinfo -h | awk '{print $6}' | sort -u); do
            for host in $(scontrol show hostname $hostList); do
                    echo $host; ssh $host "ps aux | grep user1";
            done;
    done;

但是,由于您可能不想登录离线节点,请将 sinfo 命令扩展为:

        for hostList in $(sinfo -h | grep -v down | awk '{print $6}' | sort -u); do

通过更好地了解 sinfo / scontrol 可能有更好的方法来完成此任务,但这个脚本应该可以完成这项工作。

但是,如果这种情况经常发生,您可能会考虑,与管理员讨论孤立进程通常对集群性能不利。理想情况下,系统应定期自动清洁它们。

答案2

基于诺科的回答并进一步调查我为自己的目的编写了完美的脚本:

#!/bin/bash 
hostList=$(ssh foo "sinfo -h" | awk '{print $6}' | sed 's/,/\n/g' | awk '!seen[$0]++' | sed '/\[/d')
for host in $hostList; do
    echo $host;
    ssh "$1@$host.uni.com" "ps aux | grep $2";
    #ssh "$1@$host.uni.com" "pkill -f $2";
done;

foo我的例子中的主节点在哪里。该脚本接受两个参数,其中sh script arg1 arg2arg1 是user1OP 中所示的参数,也是arg2它将搜索的关键字。如果要删除分配给该关键字的所有进程,他/她应该取消注释该行pkill命令。

我观察到,显示为的节点baz[080-081,083]在可能情况下都是相同的,因此需要搜索所有节点。

相关内容