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

8

Eu preciso criar um loop while que, se dmesg retornar algum / algum valor, deve matar um processo determinado.

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

Não sei se, em vez de ! -z , devo fazer [ test -n "$BUG" ]

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

Eu não sei se o script funcionará mesmo porque o bloqueio de BUG interrompe todos os processos, mas ainda há mais algumas linhas em dmesg até que o computador fique completamente borked - talvez eu possa recuperar o atraso e matar o processo .

    
por Nobody 24.04.2018 / 05:37

2 respostas

12

Algumas questões:

  • Você está executando isso em um loop ocupado, que consumirá tantos recursos quanto puder. Esta é uma instância em que sleep ing poderia ser justificável.
  • No entanto, versões recentes de dmesg têm um sinalizador para seguir a saída , para que você possa reescrever o coisa toda 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.
  • É muito estranho, mas [ é o mesmo que test - consulte help [ .
por 24.04.2018 / 06:19
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.,"
        }'

Isso vamos fazer o looping, que tem algumas vantagens:

  • funcionará até que o processo morra.
  • Ele também não chama mais de 1 killall por ocorrência da cadeia de pesquisa "BUG: travamento da fila de trabalho", que melhora a outra resposta.

Para testar: você pode colocar isso em um script chamado thescript e fazer nohup thescript & , de modo que thescript continue sendo executado mesmo depois de sair da sessão.

Quando estiver satisfeito, isso funciona, mate-o e, em vez disso, você pode (em vez de executá-lo em um shell com nohup ) transformá-lo em daemon script que pode ser iniciado em seu nível de execução atual.

ie: usando outro script como modelo (você precisa ter pelo menos as seções de início, parada e status), você pode modificar thescript apropriadamente e então colocá-lo dentro de /etc/rc.d/init.d , e ter um link simbólico para ele chamado Sxxthescript sob o (s) apropriado (s) /etc/rc.d/rcN , N sendo um número para seu nível de execução normal (consulte as linhas superiores de who -a para saber o nível de execução atual). E também tenha os links simbólicos Kxxthescript apropriados, em todos (ou quase todos) níveis de execução, para que o script seja apropriadamente eliminado ao alternar os níveis de execução.

Ou faça "as coisas apropriadas" para que ele seja executado / interrompido via systemd ou qualquer sistema equivalente que sua distribuição use.

    
por 24.04.2018 / 08:18