Eu preciso criar um while
loop que, se dmesg
retornar 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 ! -z
eu 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 dmesg
até que o computador seja completamente acionado - talvez eu possa recuperar o atraso e interromper o processo.
Respostas:
Alguns problemas:
sleep
pode justificar concebivelmente.No entanto, versões recentes de
dmesg
têm um sinalizador para seguir a saída , para que você possa reescrever tudo como (não testado)[
é o mesmo quetest
- vejahelp [
.fonte
-q
para quegrep -q 'searchstring
saísse da linhadmesg --follow
e, 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?tail
.tail --lines=0
faz? Eu sei o que isso significa para qualquer outro valor.--follow
seguintes linhas (ou seja, impressões), apenas as linhas que chegam após o início do comando.Uma variante da resposta de @ l0b0:
Vamos fazer o loop, que tem algumas vantagens:
killall
por 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
thescript
e donohup thescript &
, para quethescript
continue 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 umdaemon script
que 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
thescript
adequadamente, colocá-lo no interior/etc/rc.d/init.d
e ter um link simbólico para ele nomeadoSxxthescript
sob o (s) apropriado (s)/etc/rc.d/rcN
,N
sendo um número para o seu nível de execução normal (consulte as linhas principaiswho -a
para saber o nível de execução atual). E também tenha osKxxthescript
links 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.
fonte