GNU/Linux >> Linux Esercitazione >  >> Linux

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

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 avviato 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 ridurlo a 2 processi..

Diverso da 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 tutto a parte il processo originale? Quindi non ci sarebbero tempi di inattività pari a zero?


Programmi per monitorare se un processo su un sistema è in esecuzione.

Lo script è memorizzato in crontab e viene eseguito una volta al minuto.

Funziona se il processo non è in esecuzione o il processo è in esecuzione più volte:

#! /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, riavviarlo.
1 Se il processo viene trovato, tutto ok.
* Se il processo ne esegue 2 o più, termina l'ultimo.

Una versione più semplice. Questo verifica solo se il processo è in esecuzione e, in caso contrario, riavvialo.

Testa solo il flag di uscita $? dal pidof programma. Sarà 0 del processo è in esecuzione e 1 in caso contrario.

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

E finalmente, una riga

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

Questo può quindi essere utilizzato in crontab per essere eseguito ogni minuto in questo modo:

* * * * * pidof amadeus.x86 >/dev/null ; [[ $? -ne 0 ]] && echo "Restarting Amadeus:     $(date)" >> /var/log/amadeus.txt && /etc/amadeus/amadeus.x86 &

cccam oscam


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

Linux
  1. Come controllare la versione del sistema operativo e di Linux

  2. Il risultato di Ls * , Ls ** e Ls ***?

  3. Controlla i servizi in esecuzione su Linux

  4. Come verificare se un processo è ancora in esecuzione utilizzando Python su Linux?

  5. Comando Linux per verificare se uno script di shell è in esecuzione o meno

Come controllare tutti i servizi in esecuzione in Linux

Come controllare la complessità della password in Linux

Come controllare il runlevel in Linux

Come trovare e uccidere i processi in esecuzione in Linux

Controlla il fuso orario in Linux

Come trovare il PID e il PPID di un processo in Linux