Script Linux pour vérifier si le processus est en cours d’exécution et agir sur le résultat

J’ai un processus qui échoue régulièrement et commence parfois des instances en double.

Lorsque je lance: ps x |grep -v grep |grep -c "processname" , j’obtiendrai:

Si j’obtiens 0 je voudrais commencer le processus si je reçois: 4 Je veux arrêter et redémarrer le processus

Ce dont j’ai besoin, c’est d’une manière de prendre le résultat de ps x |grep -v grep |grep -c "processname"

Ensuite, configurez une fonction simple en 3 options

 ps x |grep -v grep |grep -c "processname" if answer = 0 (start process & write NOK & Time to log /var/processlog/check) if answer = 2 (Do nothing & write OK & time to log /var/processlog/check) if answer = 4 (stot & restart the process & write NOK & Time to log /var/processlog/check) 

Le processus est arrêté avec le killall -9 process Le processus est démarré avec le process -b -c /usr/local/etc

Mon principal problème est de trouver un moyen d’agir sur le résultat de ps x |grep -v grep |grep -c "processname" .

Idéalement, je voudrais faire du résultat de cette grep une variable dans le script avec quelque chose comme ceci:

process=$(ps x |grep -v grep |grep -c "processname")

Si possible.

Voici un script que j’utilise pour surveiller si un processus est en cours d’exécution sur un système.
Le script est stocké dans crontab et s’exécute une fois par minute.

 #! /bin/bash case "$(pidof amadeus.x86 | wc -w)" in 0) echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt /etc/amadeus/amadeus.x86 & ;; 1) # all ok ;; *) echo "Removed double Amadeus: $(date)" >> /var/log/amadeus.txt kill $(pidof amadeus.x86 | awk '{print $1}') ;; esac 

0 Si le processus n’est pas trouvé, redémarrez-le.
1 Si le processus est trouvé, tout va bien.
* Si le processus est en cours d’exécution 2 ou plus, tuez le dernier.


Une version plus simple Il suffit de tester si le processus est en cours d’exécution et, si ce n’est pas le cas, de le redémarrer.
Il teste simplement le drapeau de sortie $? du programme pidof . Il y aura 0 processus en cours et 1 sinon.

 #!/bin/bash pidof amadeus.x86 >/dev/null if [[ $? -ne 0 ]] ; then echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt /etc/amadeus/amadeus.x86 & fi 

J’ai adopté la solution @Jotne et fonctionne parfaitement! Par exemple pour le serveur mongodb dans mon NAS

 #! /bin/bash case "$(pidof mongod | wc -w)" in 0) echo "Restarting mongod:" mongod --config mongodb.conf ;; 1) echo "mongod already running" ;; esac 

J’ai adopté votre script pour ma situation Jotne.

 #! /bin/bash logfile="/var/oscamlog/oscam1check.log" case "$(pidof oscam1 | wc -w)" in 0) echo "oscam1 not running, restarting oscam1: $(date)" >> $logfile /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1 & ;; 2) echo "oscam1 running, all OK: $(date)" >> $logfile ;; *) echo "multiple instances of oscam1 running. Stopping & restarting oscam1: $(date)" >> $logfile kill $(pidof oscam1 | awk '{print $1}') ;; esac 

Pendant que je testais, je me suis heurté à un problème. J’ai commencé 3 processus supplémentaires d’oscam1 avec cette ligne: /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1 qui m’a laissé avec 8 processus pour oscam1. le problème est le suivant .. Quand je lance le script, il ne tue que 2 processus à la fois, donc je devrais l’exécuter 3 fois pour le faire passer à 2 processus ..

Autre que killall -9 oscam1 suivi de /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1 , en *) existe-t-il une meilleure façon de tuer du processus original? Donc, il n’y aurait pas de temps d’arrêt?

Utilisez Systemctl dans Linux. C’est une nouvelle façon de surveiller les services et les unités du système. En savoir plus ici https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units