클러스터의 사용자에게 할당된 모든 프로세스를 나열하는 방법

클러스터의 사용자에게 할당된 모든 프로세스를 나열하는 방법

우리 대학에는 SLURM이 관리하는 클러스터가 있습니다. 문제는 일부 리소스가 명령에 표시되지 않음에도 불구하고 구현되지 않는 경우가 있다는 것입니다 squeue. 예를 들어, scancel며칠 전에 할당된 리소스를 종료했음에도 불구하고 노드 중 하나에서 많은 CPU가 나에게 할당된 것을 확인했습니다 ! 나는 그들을 찾아서 죽이고 싶다.

내 로컬 컴퓨터에서 공개 및 개인 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

이는 3 개의 baz[081-083]노드를 의미 하며 baz081. 아니요, 이러한 노드 중 하나로 SSH를 연결하면 다음을 통해 특정 사용자에게 할당된 모든 프로세스를 나열할 수 있습니다.baz082baz083

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]가능한 경우 모두 동일하므로 모든 노드를 검색해야 함을 관찰했습니다.

관련 정보