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.
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
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
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?
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
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