lsf bkill todos os jobs PEND sem matar jobs RUN

4

Eu tenho muitas vagabundas sendo executadas no lsf, as vagas têm dois status, RUN e PEND. E eu quero matar todos os bjobs com o status PEND, como fazer isso usar script? Uma maneira codificada, acredito, é salvá-las em um arquivo e analisar todas as linhas para obter o status e a chave. Se o STAT for PEND, passe a chave para bkill $key . Mas isso é muito complicado, existe alguma função de bkill que possa fazer isso diretamente ou uma maneira não codificada para matar jobs com um status ou nome específico?

    
por cdnszip 12.10.2016 / 10:03

2 respostas

1

bjobs pode listar apenas as tarefas pendentes com -p . Seria bom se bkill -p também filtrasse os trabalhos, então bkill -p 0 mataria todos os trabalhos pendentes do usuário.

O melhor que posso pensar é alguma magia de concha. Embora não seja perfeito, deve abranger muitos casos. por exemplo,

bkill 'bjobs -p -o jobid | grep -v ^JOBID | tr '\n' ' ''

bjobs -p -o jobid listará os IDs de trabalho dos trabalhos pendentes do usuário. grep -v ^JOBID removerá o cabeçalho. tr colocará no formato que bkill espera. Um problema em potencial é que, se a lista de trabalhos for muito longa, o tamanho máximo da linha de comando ou o número máximo de argumentos da linha de comando será excedido, então o bash irá reclamar.

Há uma pequena condição de corrida aqui. Um trabalho poderia começar entre a consulta e o kill.

    
por 19.10.2016 / 19:33
1

Uma solução alternativa (também usando filtros shell como a resposta anterior, mas sem o risco de exceder o número de argumentos do comando shell permitidos):

bjobs -w | grep 'PEND' | awk '{print $1}' | xargs bkill

Verifique basicamente se há trabalhos em execução (formato wide -w, sem truncamento), use grep para filtrar trabalho PENDING, selecione jobIDs com awk e passe-os para bkill via xargs (xargs quebra o no argumentos passados para o bkill, evitando erros do tipo "Argument list too long").

    
por 28.09.2017 / 12:32