Иногда случается, что при сбое (например при большой нагрузке или при временном отсутствии
каналов связи) важные демоны самостоятельно завершают свою работу.
Например может случаться вот такая ошибка
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
fiif [ $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.me/tips/info/889.shtml
А как же daemontools?
Как правило у любого демона есть опция запуска foreground:#!/bin/sh
echo $$ > /var/run/`basename $0`.pid
while true; do
{путь к демону} -D
doneэто гораздо надежнее - мгновенно восстанавливается при любом завершении, запускать скрипт с &. Убить kill `cat /var/run/...`
Зачем плодить процессы (особенно через while true :) ), если есть супервизоры (xinetd,daemontools,monit и тд), специально для этого предназначенные.
Эти процессы висят - пить есть не просят, время процессорное не тратять - зато живучесть нужных демонов максимальная
http://smarden.org/runit/
бывают случаи, когда демон отвалится, а pid остаётся.Предлагаю по крону запускать следующее:
#!/bin/sh
num=`ps ax|grep /usr/bin/daemon|wc -l`
if [ $num -lt 2 ]; then
/usr/local/bin/start.daemon
fi
Проверку количества процессов поставить по вкусу.
> бывают случаи, когда демон отвалится,
> а pid остаётся.
именно это и проверяет kill -0 $PID 2>/dev/null
так проще!
#!bin/sh
ps ax |grep squid |grep -v grep
if expr $? = 1
then
echo "Squid Starting"
squid
else
echo "Squid Alredy started"
fi
Ой посмешил...
1) а следить?
2) А нарваться на шелл-скрипт с именем "blah-squid-blah"?
эээ... а для сквида RunCache уже не решает?
#!/bin/bashsleep 2
(/sbin/pidof squid || /usr/sbin/squid)>/dev/null 2>&1
$0 &exit
Спасибо, хороший скрипт.
Как то у Вас тут все просто - раз два и сквид работает, а не учли двух деталей: 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-файла и отсутствия прав у сквида на запись собственных логов
забыл сказать, что для получения номера pid процесса в скрипте с #!bin/sh используется строка: sudo sh -c 'cat /var/run/squid/squid.pid' или sh -c 'cat /var/run/squid/squid.pid'
А у меня вылезла такая ошибка cannot open /var/run/shutdown.pid. И не могу найти как поправить