it-swarm.com.de

Linux-Skript, um zu überprüfen, ob der Prozess ausgeführt wird, und auf das Ergebnis zu reagieren

Ich habe einen Prozess, der regelmäßig fehlschlägt und manchmal doppelte Instanzen startet.

Wenn ich Folgendes ausführe: ps x |grep -v grep |grep -c "processname", Erhalte ich Folgendes: 2 Dies ist normal, da der Prozess mit einem Wiederherstellungsprozess ausgeführt wird.

Wenn ich 0 Erhalte, möchte ich den Prozess starten, wenn ich Folgendes erhalte: 4 Ich möchte den Prozess stoppen und neu starten

Was ich brauche, ist eine Möglichkeit, das Ergebnis von ps x |grep -v grep |grep -c "processname"

Richten Sie dann eine einfache 3-Optionsfunktion ein

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)

Der Vorgang wird mit killall -9 process Abgebrochen. Der Vorgang wird mit process -b -c /usr/local/etc Gestartet.

Mein Hauptproblem ist es, einen Weg zu finden, auf das Ergebnis von ps x |grep -v grep |grep -c "processname" Zu reagieren.

Im Idealfall möchte ich das Ergebnis von grep zu einer Variablen innerhalb des Skripts machen:

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

Wenn möglich.

32
linuxnoob

Programme, die überwachen, ob ein Prozess auf einem System ausgeführt wird.

Das Skript wird in crontab gespeichert und einmal pro Minute ausgeführt.

Dies funktioniert mit nicht laufenden Prozessen und zu vielen Prozessen:

#! /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 Wenn der Prozess nicht gefunden wird, starten Sie ihn neu.
1 Wenn Prozess gefunden wird, alles in Ordnung.
* Wenn zwei oder mehr Prozesse ausgeführt werden, beenden Sie den letzten.


Eine einfachere Version. Testen Sie einfach, ob der Prozess ausgeführt wird, und starten Sie ihn gegebenenfalls neu.

Es testet nur das Exit-Flag $? aus dem Programm pidof. Es wird sein 0 des Prozesses läuft und 1 wenn nicht.

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

Und endlich ein Einzeiler

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

cccam oscam

66
Jotne

Ich habe die @ Jotne-Lösung übernommen und funktioniert einwandfrei! Zum Beispiel für Mongodb-Server in meinem NAS

#! /bin/bash

case "$(pidof mongod | wc -w)" in

0)  echo "Restarting mongod:"
    mongod --config mongodb.conf
    ;;
1)  echo "mongod already running"
    ;;
esac
8
Tirias

Ich habe dein Drehbuch für meine Situation Jotne übernommen.

#! /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

Während ich testete, stieß ich auf ein Problem. Ich startete 3 zusätzliche Prozesse von oscam1 mit dieser Zeile: /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1, Wodurch ich 8 Prozesse für oscam1 hatte. Das Problem ist folgendes: Wenn ich das Skript ausführe, werden nur 2 Prozesse gleichzeitig abgebrochen, sodass ich es dreimal ausführen müsste, um es auf 2 Prozesse zu reduzieren.

Abgesehen von killall -9 oscam1 Gefolgt von /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1 Gibt es in *) Einen besseren Weg, um alle außer dem ursprünglichen Prozess zu töten? Es würde also keine Ausfallzeit geben?

4
linuxnoob

Wenn Sie awk '{print $ 1}' in '{$ 1 = "" geändert haben print $ 0} 'Sie erhalten als Ergebnis alle Prozesse mit Ausnahme des ersten. Es wird mit dem Feldtrennzeichen beginnen (ein Leerzeichen im Allgemeinen), aber ich kann mich nicht erinnern, dass ich mich um alles gekümmert habe. So:

#! /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 '{ $1=""; print $0}')
    ;;
esac

Es ist erwähnenswert, dass die pidof-Route für Befehle ohne Leerzeichen gut zu funktionieren scheint. Sie möchten jedoch wahrscheinlich zu einer ps-basierten Zeichenfolge zurückkehren, wenn Sie beispielsweise ein python - Skript mit dem Namen myscript suchen das zeigte sich unter ps wie

root 22415 54.0 0.4 89116 79076 pts/1 S 16:40 0:00/usr/bin/python/usr/bin/myscript

Nur ein FYI

0
Kris Long