第一种方法,通过一个 Shell 脚本守护进程检查目标进程是否存在。

第二种方法,通过一个守护进程与目标进程进行本地 Socket 通信。

#!/bin/sh

PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/sbin:/usr/local/bin:$PATH

trap process_user_sig SIGUSR1

process_user_sig()
{
    echo "ntpis-watchdog is still alive!"
}

echo 'Waiting for ntpis startup....'
sleep 30
echo 'Watchdog starting....'
DROP_CACHE_COUNT=0

while :
do
    LEVEL=`runlevel | cut -f2 -d ' '`
    if [ "$LEVEL" = "6" -o "$LEVEL" = "0" -o "$LEVEL" = "1" ] ; then
        break
    fi

    PAIGOQT_PID=`pidof -s ntpis`
    RESTARTED="0"

    if [ -z "$PAIGOQT_PID" ] ; then
        echo `date`" # ntpis is dead, restarting...." >> /var/log/ntpis/info.log
        killall -9 ntpis
        /usr/bin/ntpis -d -platform linuxfb
        RESTARTED="1"
    fi

    if [ "$RESTARTED" = "1" ] ; then
        sleep 30
        continue
    fi
done

第二种方法详情见代码。