Como posso criar um loop infinito que mata um processo se algo é encontrado no dmesg?

8

Eu preciso criar um whileloop que, se dmesgretornar algum / qualquer valor, deve matar um determinado processo.

Aqui está o que eu tenho.

#!/bin/bash
while [ 1 ];
do

BUG=$(dmesg | grep "BUG: workqueue lockup" &> /dev/null)

    if [ ! -z "$BUG" ]; then
   killall someprocessname

else
    break
    fi
    done

Eu não sei se, em vez de ! -zeu deveria fazer[ test -n "$BUG" ]

Eu acho que com -n diz algo sobre esperar um binário.

Não sei se o script funcionará porque o bloqueio do BUG interrompe todos os processos, mas ainda há mais algumas linhas dmesgaté que o computador seja completamente acionado - talvez eu possa recuperar o atraso e interromper o processo.

Ninguém
fonte
2
Você pega o dmesg inteiro; assim que uma ocorrência da string pesquisada ocorrer, você não a verá toda vez e, portanto, matará todas as repetições! (Além das outras coisas de @ l0b0 mencionada como a falta de sono / ritmo, etc)
Olivier Dulac

Respostas:

12

Alguns problemas:

  • Você está executando isso em um loop ocupado, que consumirá o máximo de recursos possível. Esse é um exemplo em que se sleeppode justificar concebivelmente.
  • No entanto, versões recentes de dmesgtêm um sinalizador para seguir a saída , para que você possa reescrever tudo como (não testado)

    while true
    do
        dmesg --follow | tail --follow --lines=0 | grep --quiet 'BUG: workqueue lockup'
        killall someprocessname
    done
  • O código deve ser recuado para ser legível.
  • É realmente estranho, mas [é o mesmo que test- veja help [.
l0b0
fonte
1
Você queria adicionar -qpara que grep -q 'searchstringsaísse da linha dmesg --followe, assim, atingisse a próxima linha assim que vir uma ocorrência da string de pesquisa? Sem ele, seu loop não alcançará o killall nem o loop?
Olivier Dulac
1
E mesmo com -q, eu temo que você mate tudo, se dmesg --follow mostra algumas linhas do contexto dmesg (e, portanto, mostra as ocorrências anteriores), daí a minha proposta de resposta como uma variante.
21318 Olivier Dulac
@OlivierDulac Esta última questão deve ser resolvida com o tail.
precisa saber é
O que tail --lines=0faz? Eu sei o que isso significa para qualquer outro valor.
Joe
1
@ Joe Está na página de manual - com as --followseguintes linhas (ou seja, impressões), apenas as linhas que chegam após o início do comando.
L0b0 29/0418
9

Uma variante da resposta de @ l0b0:

dmesg --follow | awk '
   /BUG: workqueue lockup/  { system ("killall someprocessname") ; rem="done at each occurrence. You could add further things, like print to a logfile, etc.,"
        }'

Vamos fazer o loop, que tem algumas vantagens:

  • funcionará até que esse processo morra.
  • Também não chama mais de 1 killallpor ocorrência da cadeia de pesquisa "BUG: bloqueio da fila de trabalho", o que melhora a outra resposta.

Para testar: você pode colocar isso em um script chamado thescripte do nohup thescript &, para que thescriptcontinue em execução mesmo após o encerramento da sessão.

Quando estiver satisfeito, ele funciona, mate-o e, em seguida, você pode (em vez de executá-lo toda vez em um shell com nohup) transformá-lo em um daemon scriptque você pode ter iniciado no seu nível de execução atual.

ou seja: usando outro script como modelo (você precisa ter pelo menos as seções de início, parada e status), é possível modificá-lo thescriptadequadamente, colocá-lo no interior /etc/rc.d/init.de ter um link simbólico para ele nomeado Sxxthescriptsob o (s) apropriado (s) /etc/rc.d/rcN, Nsendo um número para o seu nível de execução normal (consulte as linhas principais who -apara saber o nível de execução atual). E também tenha os Kxxthescriptlinks simbólicos apropriados , em todos (ou quase todos) os níveis de execução, para que o script seja eliminado adequadamente ao alternar os níveis de execução.

Ou faça "as coisas apropriadas" para executá-lo / interrompê-lo via systemd ou qualquer sistema equivalente usado por sua distribuição.

Olivier Dulac
fonte
@ Ninguém: estou feliz. Não se esqueça de "aceitar" (marca de seleção verde) as respostas que parecerem melhores na sua opinião, a menos que você sinta que precisa permanecer aberto para permitir respostas adicionais (ou modificações das respostas atuais).
26618 Olivier Dulac
ambas as respostas estão corretas, desejo que eu pudesse selecionar as duas.
27518 Ninguem