Я решил это с помощью сторожевого скрипта, который напрямую (grep) проверяет, запущена (ли) программа (ы). вызывая watchdog каждую минуту (из cron под Ubuntu), я в основном гарантирую (программы и среда ОЧЕНЬ стабильны), что ни одна из программ не будет оставаться в автономном режиме более 59 секунд.
этот скрипт проверит список программ, использующих имя в массиве, и проверит, запущена ли каждая из них, и, если нет, запустит его.
#!/bin/bash
#
# watchdog
#
# Run as a cron job to keep an eye on what_to_monitor which should always
# be running. Restart what_to_monitor and send notification as needed.
#
# This needs to be run as root or a user that can start system services.
#
# Revisions: 0.1 (20100506), 0.2 (20100507)
# first prog to check
NAME[0]=soc_gt2
# 2nd
NAME[1]=soc_gt0
# 3rd, etc etc
NAME[2]=soc_gp00
# START=/usr/sbin/$NAME
NOTIFY=you@gmail.com
NOTIFYCC=you2@mail.com
GREP=/bin/grep
PS=/bin/ps
NOP=/bin/true
DATE=/bin/date
MAIL=/bin/mail
RM=/bin/rm
for nameTemp in "${NAME[@]}"; do
$PS -ef|$GREP -v grep|$GREP $nameTemp >/dev/null 2>&1
case "$?" in
0)
# It is running in this case so we do nothing.
echo "$nameTemp is RUNNING OK. Relax."
$NOP
;;
1)
echo "$nameTemp is NOT RUNNING. Starting $nameTemp and sending notices."
START=/usr/sbin/$nameTemp
$START 2>&1 >/dev/null &
NOTICE=/tmp/watchdog.txt
echo "$NAME was not running and was started on `$DATE`" > $NOTICE
# $MAIL -n -s "watchdog notice" -c $NOTIFYCC $NOTIFY < $NOTICE
$RM -f $NOTICE
;;
esac
done
exit
Я не использую проверку журнала, хотя вы можете легко включить ее в свою собственную версию (например, просто измените grep для проверки журнала).
если вы запустите его из командной строки (или замазки, если вы подключены удаленно), вы увидите, что работало, а что нет. использовал его в течение нескольких месяцев без икоты. просто вызывайте его всякий раз, когда хотите посмотреть, что работает (независимо от того, работает ли он под cron).
Вы также можете поместить все критически важные программы в одну папку, составить список каталогов и проверить, есть ли в каждом файле в этой папке программа, работающая под тем же именем. или прочитайте текстовый файл построчно, каждая строка соответствует программе, которая должна быть запущена. etcetcetc