Linux Script, чтобы проверить, запущен ли процесс, и действовать на результат
У меня есть процесс, который не работает регулярно и иногда запускает повторяющиеся экземпляры.
Когда я запускаю:
ps x |grep -v grep |grep -c "processname"
Я получу:
2
Это нормально, так как процесс выполняется с процессом восстановления.
Если я получу
0
Я хочу начать процесс
если я получу:
4
Я хочу остановить и перезапустить процесс
Мне нужен способ получить результат ps x |grep -v grep |grep -c "processname"
Затем настройте простую 3-опционную функцию
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)
Процесс останавливается с помощью
killall -9 process
Процесс начинается с
process -b -c /usr/local/etc
Моя основная проблема - найти способ действовать на результат ps x |grep -v grep |grep -c "processname"
.
В идеале я хотел бы сделать результат этой grep переменной в script с чем-то вроде этого:
process=$(ps x |grep -v grep |grep -c "processname")
Если возможно.
Ответы
Ответ 1
Программы для мониторинга, если процесс в системе работает.
Скрипт хранится в crontab
и запускается раз в минуту.
Это работает с не запущенным процессом для многих процессов:
#! /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
Если процесс не найден, перезапустите его.
1
Если процесс найден, все в порядке.
*
Если процесс запущен 2 или более, убейте последнего.
Более простая версия. Это просто проверка, если процесс запущен, и если нет, перезапустите его.
Он просто проверяет флаг выхода $?
из программы pidof
. Это будет 0
процесса запущен и 1
, если нет.
#!/bin/bash
pidof amadeus.x86 >/dev/null
if [[ $? -ne 0 ]] ; then
echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt
/etc/amadeus/amadeus.x86 &
fi
И наконец, один вкладыш
pidof amadeus.x86 >/dev/null ; [[ $? -ne 0 ]] && echo "Restarting Amadeus: $(date)" >> /var/log/amadeus.txt && /etc/amadeus/amadeus.x86 &
cccam oscam
Ответ 2
Я принял решение @Jotne и отлично работает! Например, для сервера mongodb в моем NAS
#! /bin/bash
case "$(pidof mongod | wc -w)" in
0) echo "Restarting mongod:"
mongod --config mongodb.conf
;;
1) echo "mongod already running"
;;
esac
Ответ 3
Я принял ваш script для моей ситуации 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
Пока я тестировал, у меня возникла проблема.
Я начал 3 дополнительных процесса oscam1 с этой строкой:
/usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1
который оставил мне 8 процессов для oscam1. проблема в том, что..
Когда я запускаю script, он убивает только 2 процесса за раз, поэтому я должен был запустить его 3 раза, чтобы получить его до 2 процессов.
Кроме killall -9 oscam1
, за которым следует /usr/local/bin/oscam1 -b -c /usr/local/etc/oscam1 -t /usr/local/tmp.oscam1
, в *)
есть ли лучший способ killall помимо исходного процесса? Итак, будет нулевой простой?
Ответ 4
Используйте Systemctl в Linux. Это новый способ мониторинга системных служб и подразделений. Подробнее здесь https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units
Ответ 5
Если вы изменили awk '{print $ 1}' на '{$ 1 = ""; print $ 0} 'в результате вы получите все процессы, кроме первого. Он начнется с разделителя полей (обычно это пробел), но я не помню, чтобы все заботились о killall. Итак:
#! /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
Стоит отметить, что маршрут pidof работает нормально для команд без пробелов, но вы, вероятно, захотите вернуться к строке на основе ps, если вы ищете, скажем, скрипт на python с именем myscript, который появился под пс как
root 22415 54,0 0,4 89116 79076 pts/1 S 16:40 0:00/usr/bin/python/usr/bin/myscript
Просто к вашему сведению