Linux Script per verificare se il processo è in esecuzione e agire sul risultato

Ho un processo che fallisce regolarmente e a volte inizia istanze duplicate ..

Quando ps x |grep -v grep |grep -c "processname" : ps x |grep -v grep |grep -c "processname" : 2 Questo è normale in quanto il processo viene eseguito con un processo di ripristino.

Se ottengo 0 voglio avviare il processo se ottengo: 4 Voglio interrompere e riavviare il processo

Quello di cui ho bisogno è un modo per prendere il risultato di ps x |grep -v grep |grep -c "processname"

Quindi impostare una semplice funzione di opzione 3

 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) 

Il processo viene interrotto con killall -9 process Il processo è avviato con process -b -c /usr/local/etc

Il mio problema principale è trovare un modo per agire sul risultato di ps x |grep -v grep |grep -c "processname" .

Idealmente, mi piacerebbe rendere il risultato di quella grep una variabile all’interno dello script con qualcosa del genere:

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

Se ansible.

Ecco uno script che uso per monitorare se un processo su un sistema è in esecuzione.
Lo script è memorizzato in crontab e viene eseguito una volta al minuto.

 #! /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 Se il processo non viene trovato, riavvialo.
1 Se il processo è stato trovato, tutto ok.
* Se il processo esegue 2 o più, uccidere l’ultimo.


Una versione più semplice. Questo solo verifica se il processo è in esecuzione e se non lo riavvia.
Verifica solo la bandiera di uscita $? dal programma pidof . Sarà 0 di processo in esecuzione e 1 se non.

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

Ho adottato la soluzione @Jotne e funziona perfettamente! Ad esempio per il server mongodb nel mio NAS

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

Ho adottato il tuo copione per la mia situazione 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 

Mentre stavo testando, mi sono imbattuto in un problema .. Ho iniziato 3 processi extra di oscam1 con questa riga: /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1 che mi ha lasciato con 8 processi per oscam1. il problema è questo .. Quando eseguo lo script, uccide solo 2 processi alla volta, quindi dovrei eseguirlo 3 volte per farlo scendere a 2 processi ..

Altro che killall -9 oscam1 seguito da /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1 , in *) c’è un modo migliore per uccidere a parte dal processo originale? Quindi non ci sarebbero tempi morti?

Usa Systemctl in linux. È un nuovo modo per monitorare i servizi e le unità SystemD. Ulteriori informazioni qui https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units