Como listar todos os processos atribuídos a um usuário em um cluster

1

Temos um cluster em nossa universidade controlado pelo SLURM. A questão é que observei algumas vezes que alguns dos recursos não estão sendo percebidos, mesmo que eles não apareçam no comando squeue . Por exemplo, vi que muitas CPUs em um dos nós foram designadas para mim, apesar do fato de eu ter matado os recursos alocados com scancel alguns dias atrás! Eu quero encontrá-los e matá-los.

Em minha máquina local, gerei chaves ssh públicas e privadas com ssh-keygen , de modo que agora posso fazer login em qualquer uma dessas máquinas com ssh foo , ssh [email protected] , ssh [email protected] ..., mas os nomes desses nós não estão em um pedido. Se um login para um desses nós e executar sinfo , este é o resultado:

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

em que baz[081-083] se refere a 3 nós baz081 , baz082 e baz083 . Não, se eu ssh em qualquer um desses nós, posso listar todos os processos atribuídos a um usuário específico por:

ps -A | grep user1

mas isso levaria muito tempo. Como posso automatizar este processo:

  1. faça login em um dos nós
  2. executar sinfo
  3. extraia as informações e faça uma lista de sequências a partir da última coluna do comando sinfo
  4. encontre todos os processos em execução com um usuário específico user1 e imprima no terminal

Como posso escrever um script, de preferência compatível com o Cmder / ConEmu, para automatizar essas etapas.

    
por Foad 05.09.2018 / 10:35

2 respostas

2

Isso tentará fazer login em todos os nós e imprimir processos do usuário1:

    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;

No entanto, como você provavelmente não deseja efetuar login em nós offline, estenda o comando sinfo para:

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

Pode haver maneiras ainda melhores de conseguir isso com um conhecimento melhor do sinfo / scontrol, mas esse script deve fazer o trabalho.

No entanto, se isso acontecer muito, considere conversar com seus administradores como processos órfãos que são ruins para o desempenho do cluster em geral. Eles devem idealmente ser limpos pelo sistema automaticamente em uma base regular.

    
por 05.09.2018 / 12:42
1

Com base na resposta da Noco e mais investigação, escrevi o roteiro perfeito para meu próprio propósito:

#!/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;

onde foo é o nó principal no meu caso. Este script aceita dois argumentos como sh script arg1 arg2 em que arg1 é o user1 conforme indicado em OP e arg2 é a palavra-chave que ele procurará. Se alguém quiser remover todos os processos atribuídos a essa palavra-chave, ele deve remover o comentário da linha com o comando pkill .

O que eu observei é que os nós mostrando como baz[080-081,083] são todos iguais em maiúsculas, então é necessário pesquisar todos.

    
por 06.09.2018 / 15:02