J'ai besoin de créer une while
boucle qui si dmesg
retourne une valeur quelconque, alors elle devrait tuer un processus déterminé.
Voici ce que j'ai.
#!/bin/bash
while [ 1 ];
do
BUG=$(dmesg | grep "BUG: workqueue lockup" &> /dev/null)
if [ ! -z "$BUG" ]; then
killall someprocessname
else
break
fi
done
Je ne sais pas si ! -z
je devrais faire[ test -n "$BUG" ]
Je pense qu'avec -n cela dit quelque chose sur l'attente d'un binaire.
Je ne sais pas si le script fonctionnera même parce que le blocage de BUG arrête tous les processus, mais il reste encore quelques lignes dmesg
jusqu'à ce que l'ordinateur soit complètement foutu - je peux peut-être rattraper et tuer le processus.
Réponses:
Quelques problemes:
sleep
ing pourrait être justifié.Cependant, les versions récentes de
dmesg
ont un indicateur pour suivre la sortie , vous pouvez donc réécrire le tout en (non testé)[
c'est la même chose quetest
- voyezhelp [
.la source
-q
pour que lesgrep -q 'searchstring
sorties de ladmesg --follow
et ainsi laisser la ligne suivante être atteinte dès qu'il voit une occurrence de la chaîne de recherche? Sans cela, votre boucle n'atteindra pas le killall ni la boucle?tail
.tail --lines=0
-il? Je sais ce que cela signifie pour toute autre valeur.--follow
elle suit (c'est-à-dire, imprime) uniquement les lignes arrivant après le démarrage de la commande.Une variante de la réponse de @ l0b0:
Cela nous permet de faire le bouclage, ce qui présente certains avantages:
killall
par occurrence de la chaîne de recherche "BUG: workqueue lockup", ce qui améliore l'autre réponse.Pour tester: Vous pouvez mettre cela dans un script nommé
thescript
, et fairenohup thescript &
, afin quethescript
cela continue même après avoir quitté votre session.Une fois que vous êtes satisfait, cela fonctionne, tuez-le, puis vous pouvez (au lieu de l'exécuter à chaque fois dans un shell avec
nohup
) le transformer en undaemon script
que vous pouvez ensuite avoir démarré dans votre niveau d'exécution actuel.c'est-à-dire: en utilisant un autre script comme modèle (vous devez avoir au moins les sections start, stop et status), vous pouvez le modifier de
thescript
manière appropriée, puis le placer à l'intérieur/etc/rc.d/init.d
, et avoir un lien symbolique vers celui-ci nomméSxxthescript
sous le (s) approprié (s)/etc/rc.d/rcN
,N
étant un numéro de votre niveau d'exécution normal (voir les premières lignes dewho -a
pour connaître le niveau d'exécution actuel). Et disposez également desKxxthescript
liens symboliques appropriés , dans tous les niveaux d'exécution (ou presque), afin que le script soit correctement supprimé lors du changement de niveau d'exécution.Ou faites "les choses appropriées" pour le faire fonctionner / arrêter via systemd ou tout système équivalent utilisé par votre distribution.
la source