Como otimizar o 'grep'-and-save?

3

Eu quero saber em qual nó meus cálculos estavam rodando em nosso cluster caso o nó falhasse e não recebo nenhum arquivo de volta para saber em qual nó eu tenho que procurar.

Para esse caso eu escrevi um pequeno script que faz o trabalho - exceto em alguns casos que eu de alguma forma não consigo gerenciar.

Eu quero analisar a saída a seguir JobID, a fila, o nome da tarefa e o nó em que está sendo executado - se estiver em execução.

my12name@omega:/some/fancy/path> qstat -n -u my12name

omega.cluster: 
                                                                   Req'd  Req'd   Elap
Job ID               Username Queue    Jobname    SessID NDS   TSK Memory Time  S Time
-------------------- -------- -------- ---------- ------ ----- --- ------ ----- - -----
2974949.omega.cluste my12name  short    j-M0044_td  21582     1   8 12288m 500:0 R 120:1
   node54/7+node54/6+node54/5+node54/4+node54/3+node54/2+node54/1+node54/0
2974950.omega.cluste my12name  short    j-M0045_td    --      1   8 12288m 500:0 R 120:2
   octo08/7+octo08/6+octo08/5+octo08/4+octo08/3+octo08/2+octo08/1+octo08/0
2974951.omega.cluste my12name  short    j-M0046_td    --      1   8 12288m 500:0 R 120:3
   il41/7+il41/6+il41/5+il41/4+il41/3+il41/2+il41/1+il41/0
2974951.omega.cluste my12name  short    j-M0046_td    --      1   8 12288m 500:0 R 120:3
   il41/15+il41/14+il41/13+il41/12+il41/11+il41/10+il41/9+il41/8
   +il41/7+il41/6+il41/5+il41/4+il41/3+il41/2+il41/1+il41/0
2976371.omega.cluste my12name  short    j-M0049_fr    --      1   8 12288m 500:0 Q   -- 
    -- 

Meu script para isso atualmente é assim:

#!/bin/bash                                                                                                                                                                                                                           

qstat -n -u my12name |grep -v "[ ]+" > DeleteMeQuick1
cat DeleteMeQuick1|grep 'node\|octo\|il' |tr "/" " "|awk '{print $1}' > DeleteMeQuick2
cat DeleteMeQuick1|grep 'my12name'|awk '{print $1, $3, $4}' > DeleteMeQuick3
awk 'NR==FNR{a[NR]=$0; next} {print a[FNR], $0}' DeleteMeQuick2 DeleteMeQuick3 >> ~/.qstat_history
cat ~/.qstat_history|awk '!NF ||!seen[$2]++' > DeleteMeQuick4
cat DeleteMeQuick4 > ~/.qstat_history
rm DeleteMeQuick*

Leva a consulta e

  1. procura por linhas que não iniciam com um sinal de adição e as salva em um arquivo temporário
  2. deste arquivo, ele procura por linhas iniciadas pelos possíveis nomes de nó e as salva em um segundo arquivo temporário
  3. também leva das linhas não-nó o JobID, etc.
  4. adiciona de cada arquivo temporário a 1ª, a 2ª, a 3ª ... linha ao lado do meu arquivo de histórico
  5. exclui entradas duplicadas do arquivo de histórico
  6. exclui arquivos temporários

A saída no meu arquivo de histórico é assim:

...
octo11 2955937.omega.cluste big16 j-M0044_op
node55 2956189.omega.cluste short j-M0045_op
il11 2963103.omega.cluste oshort n2.sh
....

Exemplo para o meu primeiro grep

Saída normal:

2976388.omega.cluste my12name  big24    n2.sh       28095     1  --   48gb 300:0 R   -- 
   il32/23+il32/22+il32/21+il32/20+il32/19+il32/18+il32/17+il32/16+il32/15
   +il32/14+il32/13+il32/12+il32/11+il32/10+il32/9+il32/8+il32/7+il32/6+il32/5
   +il32/4+il32/3+il32/2+il32/1+il32/0

E quando usar ...|grep -v '[ ]+' :

2976388.omega.cluste my12name  big24    n2.sh       28095     1  --   48gb 300:0 R   -- 
   il32/23+il32/22+il32/21+il32/20+il32/19+il32/18+il32/17+il32/16+il32/15

O que poderia ser uma maneira melhor e mais eficiente de abordar essa tarefa?

Atualmente, meu script não pode ignorar trabalhos que não foram iniciados (a linha de trabalho contém o "Q" e a linha do nó contém apenas os hífens duplos).

    
por pH13 - Yet another Philipp 06.03.2016 / 14:50

1 resposta

2

Thak você, cas. Sua ideia de US $ 12 me ajudou a obter essa nova versão.

Consegui reduzi-lo ao seguinte:

#!/bin/bash
qstat -n -u my12name|grep -v '[ ]---\|[ ]+\|Username\|Elap'|paste - -|sed 's/\/.*//g'|grep -v ' Q ' >> ~/.qstat_history
cat ~/.qstat_history|awk '!NF ||!seen[$1]++'|sed '/^\s*$/d' > qstat_history.tmp
mv qstat_history.tmp ~/.qstat_history

Está excluindo as linhas iniciais (Nome de usuário, Elap, ---) e as linhas que começam com um sinal de mais, depois coloca a linha do nó atrás da linha de trabalho ( paste - - ), exclui o material do nó por trás da linha barra ( s/\/.*//g ) e greps todo trabalho que está executando resp. não grep jobs que estão aguardando ( |grep -v ' Q ' ). O que sobrou será adicionado ao meu arquivo .qstat_history.

A próxima é excluir linhas duplicadas com o awk, salvá-lo no arquivo temporário e mover o arquivo temporário para o novo .qstat_history.

Foi-me mostrado uma função do qstat que é muito oculto ( -1 ), que coloca a linha do nó diretamente atrás da linha de trabalho. Isso facilita um pouco mais para dar a seguinte versão:

#!/bin/bash
qstat -u my12name -n -1|sed 's/\/.*//g'|grep ' R ' >> ~/.qstat_history
cat ~/.qstat_history|awk '!NF ||!seen[$1]++' > qstat_history.tmp
mv qstat_history.tmp ~/.qstat_history
    
por 07.03.2016 / 11:10