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.


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 [.

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.


@ 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.