GNU/Linux >> Tutoriels Linux >  >> Linux

Comment puis-je créer une boucle infinie qui tue un processus si quelque chose est trouvé dans dmesg ?

Quelques problèmes :

  • Vous exécutez ceci dans une boucle occupée, qui consommera autant de ressources que possible. Il s'agit d'un cas où sleep ing pourrait être justifié.
  • Cependant, les versions récentes de dmesg avoir un indicateur pour suivre la sortie, vous pouvez donc réécrire le tout comme (non testé)

    while true
    do
        dmesg --follow | tail --follow --lines=0 | grep --quiet 'BUG: workqueue lockup'
        killall someprocessname
    done
    
  • Le code doit être en retrait pour être lisible.
  • C'est vraiment étrange, mais [ est identique à test - voir help [ .

Une variante de la réponse 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.,"
        }'

Ceci permet à awk de faire la boucle, ce qui présente certains avantages :

  • cela fonctionnera jusqu'à ce que ce processus meure.
  • Il n'appelle pas non plus plus de 1 killall par occurrence de la chaîne de recherche "BUG :blocage de la file d'attente", qui améliore l'autre réponse.

Pour tester :vous pouvez mettre ceci dans un script nommé thescript , et faites nohup thescript & , de sorte que thescript continuera à fonctionner même après avoir quitté votre session.

Une fois que vous êtes satisfait que cela fonctionne, tuez-le, puis vous pouvez (au lieu de l'exécuter à chaque fois dans un shell avec nohup ) le transformer en un daemon script que vous pouvez alors 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 modifier thescript de manière appropriée, puis placez-le entre /etc/rc.d/init.d , et avoir un lien symbolique vers celui-ci nommé Sxxthescript sous le(s) /etc/rc.d/rcN approprié(s) , N étant un nombre pour votre niveau d'exécution normal (voir les premières lignes de who -a pour connaître le niveau d'exécution actuel). Et avoir le Kxxthescript approprié des liens symboliques également, dans tous (ou presque tous) les niveaux d'exécution, de sorte que le script soit correctement tué lors du changement de niveau d'exécution.

Ou faites "les choses appropriées" pour qu'il s'exécute/s'arrête via systemd ou tout système équivalent utilisé par votre distribution.


Linux
  1. Comment créer un script d'une commande Linux

  2. Que sont les scripts shell ? Comment créer des scripts shell ?

  3. Comment puis-je écrire un script bash Linux qui m'indique quels ordinateurs sont allumés dans mon réseau local ?

  4. Comment puis-je savoir quel processus utilise swap?

  5. Comment puis-je tester mon script Bash sur des versions plus anciennes de Bash ?

Comment créer des scripts shell

Comment créer et exécuter un script shell dans Ubuntu 22.04

Comment puis-je créer un fichier dans chaque dossier ?

Comment créer un script de configuration ?

Comment monter une image disque ?

Comment puis-je créer un fichier de vidage d'un processus en cours d'exécution sous Linux ?