Skrypt Linuksa sprawdzający czy Proces jest uruchomiony i działający na wynik

Mam proces, który regularnie zawodzi i czasami uruchamia zduplikowane instancje..

Kiedy uciekam: ps x |grep -v grep |grep -c "processname" I will get: 2 Jest to normalne, ponieważ proces przebiega z procesem odzyskiwania..

If I get 0 Będę chciał rozpocząć proces if I get: 4 Chcę zatrzymać i ponownie uruchomić proces

Potrzebuję sposobu na wzięcie wyniku ps x |grep -v grep |grep -c "processname"

Następnie Ustaw prostą funkcję 3 opcji

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)

Proces jest zatrzymywany przez killall -9 process Proces rozpoczyna się od process -b -c /usr/local/etc

Moim głównym problemem jest znalezienie sposobu działania na skutek ps x |grep -v grep |grep -c "processname".

Idealnie, chciałbym, aby wynik tego grepa stał się zmienną w skrypcie z czymś takim:

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

Jeśli to możliwe.

Author: Sam, 2013-11-23

4 answers

Oto skrypt, którego używam do monitorowania, czy proces w systemie jest uruchomiony.
Skrypt jest przechowywany w crontab I uruchamiany raz na minutę.

#! /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 Jeśli proces nie zostanie znaleziony, uruchom go ponownie.
1 Jeśli proces zostanie znaleziony, Wszystko ok.
* jeśli proces działa 2 lub więcej, Zabij ostatni.


Prostsza wersja. To tylko test, czy Proces jest uruchomiony, a jeśli nie, uruchom go ponownie.
Testuje tylko flagę wyjścia {[6] } z programu pidof. Będzie 0 procesu jest bieganie i 1 Jeśli nie.

#!/bin/bash
pidof  amadeus.x86 >/dev/null
if [[ $? -ne 0 ]] ; then
        echo "Restarting Amadeus:     $(date)" >> /var/log/amadeus.txt
        /etc/amadeus/amadeus.x86 &
fi
 62
Author: Jotne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-24 02:34:55

Przyjęłam rozwiązanie @Jotne i działa idealnie! Na przykład dla serwera mongodb w moim NAS

#! /bin/bash

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

0)  echo "Restarting mongod:"
    mongod --config mongodb.conf
    ;;
1)  echo "mongod already running"
    ;;
esac
 8
Author: Tirias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-13 00:23:31

Przyjęłam twój scenariusz do mojej sytuacji 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
Kiedy testowałem, napotkałem problem.. Zacząłem 3 dodatkowy proces oscam1 z tej linii: /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1 co pozostawiło Mi 8 proces oscam1. problem w tym.. Kiedy uruchamiam skrypt, zabija tylko 2 procesy na raz, więc musiałbym uruchomić go 3 razy, aby go do 2 procesu..

Inny niż killall -9 oscam1, po którym następuje /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1, W *) czy istnieje lepszy sposób na zabijanie oprócz pierwotnego procesu? Więc nie będzie żadnych przestojów?

 4
Author: linuxnoob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-03 10:52:13

Użyj Systemctl w Linuksie. Jest to nowy sposób monitorowania usług i jednostek systemD. Dowiedz się więcej tutaj https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units

 -1
Author: vadiraj jahagirdar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-11 04:39:28