Подтвердить что ты не робот

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")

Если возможно.

4b9b3361

Ответ 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 помимо исходного процесса? Итак, будет нулевой простой?

Ответ 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

Просто к вашему сведению