我们大学里有一个由 SLURM 控制的集群。问题是,我观察到有时某些资源没有被实现,即使它们没有出现在命令中squeue
。例如,我看到其中一个节点上的很多 CPU 都分配给了我,尽管我scancel
几天前已经杀死了分配的资源!我想找到他们并杀死他们。
在我的本地计算机上,我已经生成了公钥和私钥 ssh 密钥,因此现在我可以使用, , ...ssh-keygen
登录到任何一台机器,但这些节点的名称不是按顺序排列的。如果登录到这些节点之一并运行以下结果:ssh foo
ssh [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
,baz082
和baz083
。否,如果我 ssh 到这些节点中的任何一个,我可以通过以下方式列出分配给特定用户的所有进程:
ps -A | grep user1
但这需要很多时间。我怎样才能自动化这个过程:
- 登录到其中一个节点
- 跑步
sinfo
sinfo
提取信息并从命令的最后一列中创建一个字符串列表- 查找特定用户的所有正在运行的进程
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 arg2
arg1 是user1
OP 中所示的参数,也是arg2
它将搜索的关键字。如果要删除分配给该关键字的所有进程,他/她应该取消注释该行pkill
命令。
我观察到,显示为的节点baz[080-081,083]
在可能情况下都是相同的,因此需要搜索所有节点。