The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Скрипт для восстановления процессов на случай сбоя
Иногда случается, что при сбое (например при большой нагрузке или при временном отсутствии 
каналов связи) важные демоны самостоятельно завершают свою работу.
Например может случаться вот такая ошибка
    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
 
03.09.2005 , Автор: Yurik
Ключи: pid, kill, shell, script / Лицензия: CC-BY
Раздел:    Корень / Программисту и web-разработчику / Shell / Готовые скрипты

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, Berserker (?), 23:39, 03/09/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А как же daemontools?
     
  • 1.2, Av (??), 11:35, 04/09/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Как правило у любого демона есть опция запуска foreground:

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

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

     
     
  • 2.3, HFSC (??), 17:23, 04/09/2005 [^] [^^] [^^^] [ответить]  
  • +/
    Зачем плодить процессы (особенно через while true :) ), если есть супервизоры (xinetd,daemontools,monit и тд), специально для этого предназначенные.
     
     
  • 3.6, Av (??), 09:22, 05/09/2005 [^] [^^] [^^^] [ответить]  
  • +/
    Эти процессы висят - пить есть не просят, время процессорное не тратять - зато живучесть нужных демонов максимальная
     

  • 1.4, McLone (?), 18:16, 04/09/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    http://smarden.org/runit/
     
  • 1.5, Павел (??), 07:08, 05/09/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    бывают случаи, когда демон отвалится, а pid остаётся.

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

    #!/bin/sh

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

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


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

     
  • 1.7, Yurik (??), 10:45, 05/09/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > бывают случаи, когда демон отвалится,
    > а pid остаётся.
    именно это и проверяет kill -0 $PID 2>/dev/null
     
  • 1.8, s2 (ok), 13:10, 05/09/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    так проще!
    #!bin/sh
    ps ax |grep squid |grep -v grep
    if expr $? = 1
    then
    echo "Squid Starting"
    squid
    else
    echo "Squid Alredy started"
    fi
     
     
  • 2.9, Zulu (?), 16:45, 05/09/2005 [^] [^^] [^^^] [ответить]  
  • +/
    Ой посмешил...
    1) а следить?
    2) А нарваться на шелл-скрипт с именем "blah-squid-blah"?
     

  • 1.10, test (??), 23:33, 05/09/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    эээ... а для сквида RunCache уже не решает?
     
  • 1.11, Аноним (11), 10:09, 08/09/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    #!/bin/bash

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

    exit

     
  • 1.12, Аноним (-), 14:56, 01/03/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Спасибо, хороший скрипт.
     
  • 1.13, Denis (??), 13:33, 07/10/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Как то у Вас тут все просто - раз два и сквид работает, а не учли двух деталей: 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-файла и отсутствия прав у сквида на запись собственных логов
     
     
  • 2.14, Denis (??), 13:58, 07/10/2009 [^] [^^] [^^^] [ответить]  
  • +/
    забыл сказать, что для получения номера pid процесса в скрипте с #!bin/sh используется строка: sudo sh -c 'cat /var/run/squid/squid.pid' или sh -c 'cat /var/run/squid/squid.pid'
     

  • 1.15, cat (??), 08:07, 28/10/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А у меня вылезла такая ошибка cannot open /var/run/shutdown.pid. И не могу найти как поправить
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру