GNU/Linux >> Znalost Linux >  >> Linux

Linuxový skript pro kontrolu, zda proces běží, a podle výsledku jednat

Přijal jsem váš scénář pro mou situaci 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

Během testování jsem narazil na problém. Spustil jsem 3 další procesy oscam1 s tímto řádkem:/usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1 což mi zanechalo 8 procesů pro oscam1. problém je v tomto..Když spustím skript, zabije pouze 2 procesy najednou, takže bych ho musel spustit 3krát, abych ho dostal na 2 procesy.

Jiné než killall -9 oscam1 následuje /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1 , v *) existuje nějaký lepší způsob, jak zabít all kromě původního procesu? Takže by byly nulové prostoje?


Programy pro sledování, zda je v systému spuštěn proces.

Skript je uložen v crontab a běží jednou za minutu.

Toto funguje, pokud proces není spuštěn nebo proces běží vícekrát:

#! /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 Pokud proces není nalezen, restartujte jej.
1 Pokud je proces nalezen, vše v pořádku.
* Pokud proces běží 2 nebo více, ukončete poslední.

Jednodušší verze. Toto pouze otestuje, zda proces běží, a pokud ne, restartujte jej.

Pouze testuje výstupní příznak $? z pidof program. Bude to 0 procesu běží a 1 pokud ne.

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

A konečně jedna vložka

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

To pak lze použít v crontab ke spuštění každou minutu takto:

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

cccam oscam


Přijal jsem řešení @Jotne a funguje perfektně! Například pro mongodb server v mém 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. Jak zkontrolovat verzi OS a Linuxu

  2. Výsledek Ls *, Ls ** a Ls ***?

  3. Zkontrolujte limit otevřeného FD pro daný proces v Linuxu

  1. Linux – jak získat čas nástěnných hodin běžícího procesu?

  2. Příkaz Linux pro kontrolu, zda je spuštěn skript shellu nebo ne

  3. Jak zkontrolovat, zda skupina existuje, a přidat, pokud ne, v Linux Shell Script

  1. Zkontrolujte spuštěné služby v systému Linux

  2. Jak zkontrolovat, zda proces stále běží pomocí Pythonu na Linuxu?

  3. Jak získat pid procesu a vyvolat na něj kill -9 ve skriptu shellu?