우리 대학에는 SLURM이 관리하는 클러스터가 있습니다. 문제는 일부 리소스가 명령에 표시되지 않음에도 불구하고 구현되지 않는 경우가 있다는 것입니다 squeue
. 예를 들어, scancel
며칠 전에 할당된 리소스를 종료했음에도 불구하고 노드 중 하나에서 많은 CPU가 나에게 할당된 것을 확인했습니다 ! 나는 그들을 찾아서 죽이고 싶다.
내 로컬 컴퓨터에서 공개 및 개인 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
이는 3 개의 baz[081-083]
노드를 의미 하며 baz081
. 아니요, 이러한 노드 중 하나로 SSH를 연결하면 다음을 통해 특정 사용자에게 할당된 모든 프로세스를 나열할 수 있습니다.baz082
baz083
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]
가능한 경우 모두 동일하므로 모든 노드를 검색해야 함을 관찰했습니다.