URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 12149
[ Назад ]

Исходное сообщение
"Раздел полезных советов: Скрипт для восстановления процессов на случай сбоя"

Отправлено auto_tips , 03-Сен-05 23:39 
Иногда случается, что при сбое (например при большой нагрузке или при временном отсутствии
каналов связи) важные демоны самостоятельно завершают свою работу.
Например может случаться вот такая ошибка
    squid[703]: Exiting due to repeated, frequent failures
Такое же может иногда случаться с IPA (/usr/ports/sysutils/ipa) и Apache.

Чтобы автоматизировать отслеживание таких процессов можно создать
`crontab -e` задание (на примере Squid)

   5,35 * * * * /usr/local/etc/rc.d/checksquid


./checksquid:

   proc="squid"

   PIDFILE=/var/run/${proc}.pid
   if [ -f $PIDFILE ] ; then
        PID=`head $PIDFILE`
        if [ "x$PID" != "x" ] && kill -0 $PID 2>/dev/null ; then
            RUNNING=1
        else
            RUNNING=0
        fi
   else
        RUNNING=0
   fi

   if [ $RUNNING -eq 0 ]; then
        echo "Starting $proc again..."
        /usr/local/etc/rc.d/${proc}.sh start
        continue
   else
        echo "$proc already running"
   fi

Нужно только убедиться что нужные PID файлы хранятся в /var/run.
Директивы pid_filename в squid.conf, PidFile в httpd.conf


URL:
Обсуждается: http://www.opennet.ru/tips/info/889.shtml


Содержание

Сообщения в этом обсуждении
"Скрипт для восстановления процессов на случай сбоя"
Отправлено Berserker , 03-Сен-05 23:39 
А как же daemontools?

"Скрипт для восстановления процессов на случай сбоя"
Отправлено Av , 04-Сен-05 11:35 
Как правило у любого демона есть опция запуска foreground:

#!/bin/sh
echo $$ > /var/run/`basename $0`.pid
while true; do
       {путь к демону} -D
done

это гораздо надежнее - мгновенно восстанавливается при любом завершении, запускать скрипт с &. Убить kill `cat /var/run/...`


"Скрипт для восстановления процессов на случай сбоя"
Отправлено HFSC , 04-Сен-05 17:23 
Зачем плодить процессы (особенно через while true :) ), если есть супервизоры (xinetd,daemontools,monit и тд), специально для этого предназначенные.

"Скрипт для восстановления процессов на случай сбоя"
Отправлено Av , 05-Сен-05 09:22 
Эти процессы висят - пить есть не просят, время процессорное не тратять - зато живучесть нужных демонов максимальная

"pianerskie padelija fftopku"
Отправлено McLone , 04-Сен-05 18:16 
http://smarden.org/runit/

"Скрипт для восстановления процессов на случай сбоя"
Отправлено Павел , 05-Сен-05 07:08 
бывают случаи, когда демон отвалится, а pid остаётся.

Предлагаю по крону запускать следующее:

#!/bin/sh

num=`ps ax|grep /usr/bin/daemon|wc -l`

if [ $num -lt 2 ]; then
    /usr/local/bin/start.daemon
fi


Проверку количества процессов поставить по вкусу.


"Скрипт для восстановления процессов на случай сбоя"
Отправлено Yurik , 05-Сен-05 10:45 
> бывают случаи, когда демон отвалится,
> а pid остаётся.
именно это и проверяет kill -0 $PID 2>/dev/null

"Скрипт для восстановления процессов на случай сбоя"
Отправлено s2 , 05-Сен-05 13:10 
так проще!
#!bin/sh
ps ax |grep squid |grep -v grep
if expr $? = 1
then
echo "Squid Starting"
squid
else
echo "Squid Alredy started"
fi

"Скрипт для восстановления процессов на случай сбоя"
Отправлено Zulu , 05-Сен-05 16:45 
Ой посмешил...
1) а следить?
2) А нарваться на шелл-скрипт с именем "blah-squid-blah"?

"Скрипт для восстановления процессов на случай сбоя"
Отправлено test , 05-Сен-05 23:33 
эээ... а для сквида RunCache уже не решает?

"Скрипт для восстановления процессов на случай сбоя"
Отправлено Аноним , 08-Сен-05 10:09 
#!/bin/bash

sleep 2
(/sbin/pidof squid || /usr/sbin/squid)>/dev/null 2>&1
$0 &

exit


"Скрипт для восстановления процессов на случай сбоя"
Отправлено Аноним , 01-Мрт-07 14:56 
Спасибо, хороший скрипт.

"Скрипт для восстановления процессов на случай сбоя"
Отправлено Denis , 07-Окт-09 13:33 
Как то у Вас тут все просто - раз два и сквид работает, а не учли двух деталей: 1)squid.pid имеет защиту - файл с подписью #!bin/sh запускается без прав root'а и поэтому прочитать pid-файл не может, но есть решение использовать sudo, но тогда pid просто выводится на экран и никак в переменную не хочет записываться, в статье переменная указана, как PIDFILE - я вот не могу сообразить, как бы все таки присвоить переменной значение pid; 2) второе, что Вы не учли, что как раз таки демон может еще работать - сидеть в памяти, но через ps не выводится и pid-файл у него пуст или его вовсе нет и при попытке перезапуска (restart, reload или rotate) ругается, мол squid: error: copy no running - и здесь есть решение - последовательно выполнить: /etc/init.d/squid stop (останов демона, который спрятался где то в памяти), /etc/init.d/squid zap (что то вроде отладки), squid -z (пересоздание кеша), и только потом /etc/init.d/squid start. в некоторых случаях можно еще добавочно делать перед перекешированием killall -9 squid и chown -R squid:squid /var/log/squid на случай все ж наличия pid-файла и отсутствия прав у сквида на запись собственных логов

"Скрипт для восстановления процессов на случай сбоя"
Отправлено Denis , 07-Окт-09 13:58 
забыл сказать, что для получения номера pid процесса в скрипте с #!bin/sh используется строка: sudo sh -c 'cat /var/run/squid/squid.pid' или sh -c 'cat /var/run/squid/squid.pid'

"Скрипт для восстановления процессов на случай сбоя"
Отправлено cat , 28-Окт-09 08:07 
А у меня вылезла такая ошибка cannot open /var/run/shutdown.pid. И не могу найти как поправить