0

supervise 是 daemontools 中的强大工具之一,我想知道如何使用 bash 脚本来实现它。有人有建议吗?我需要帮助!

4

2 回答 2

1

supervise执行许多任务,并与svscan, svcok, . 互操作svstat。bash 中功能齐全的实现将是不平凡的,但守护程序重启脚本是一项相当简单的任务。

#!/bin/bash
DAEMON=/usr/sbin/whatever      # "/bin/sleep" for demo
DAEMON_ARGS="xxx"              # "15" for sleep demo

case "$1" in 
    start) 
        echo "Starting $DAEMON"
        (
            trap 'logger -i -p daemon.info "INFO: $DAEMON shutting down..."; exit 1' 1 2 3 15
            logger -i -p daemon.info "INFO: Starting $DAEMON"
            while : ; do
                $DAEMON $DAEMON_ARGS &
                pid=$!
                echo $pid > /var/run/mydaemon.pid
                wait $pid
                rc=$?
                logger -i -p daemon.warn "WARNING: $DAEMON exited, rc=$rc"
                sleep 1  # adjust as required
                logger -i -p daemon.warn "WARNING: Restarting $DAEMON"
            done
        ) &
        echo $! > /var/run/myscript.pid
    ;;        

    stop)
        echo "Stopping $DAEMON"
        [ -f /var/run/myscript.pid ] && kill $(</var/run/myscript.pid)
        [ -f /var/run/mydaemon.pid ] && kill $(</var/run/mydaemon.pid)
        ;;
esac

上面几乎没有错误处理,没有正确地执行真正的守护进程,如 chdir() 并关闭未使用的 FD,但它确实通过 logger/syslog 进行记录,因此您可以看到它在做什么。它假定$DAEMON不分叉到后台本身(如supervise)。

您还没有说明您的平台,但是如果您想要一些非常非常简单的东西,inittab 可以解决问题,请参阅如何使用 inittab 自动重启 PHP 程序?一些提示。否则,我们将退出 Stack Overflow 领域,因此请查看https://unix.stackexchange.com/

于 2013-01-15T19:11:13.037 回答
0

我稍微更改了 mr.spuratic 提供的代码

echo "true" > $STATUSFILE

case "$1" in

    start) 
        echo "Starting $DAEMON_NAME"
        (
            trap 'logger -t italoService "INFO: $DAEMON_NAME shutting down..."; exit 1' 1 2 3 15
            logger -t italoService "INFO: Starting $DAEMON_NAME"
            while : ; do
                #do_start
                read STATUS <$STATUSFILE
                if [ "$STATUS" = "false" ] ; then
                     logger -t italoService "INFO: $DAEMON_NAME stopped by user"
                     break
                fi
                $DAEMON $DAEMON_OPTS &
                pid=$!
                echo $pid > $PIDFILE
                logger -t italoService "WARNING: pid File: $pid"
                wait $pid
                rc=$?
                logger -t italoService "WARNING: $DAEMON_NAME exited, rc=$rc"
                sleep 1  # adjust as required
                read STATUS <$STATUSFILE
                if [ "$STATUS" = "true" ] ; then
                     logger -t italoService "WARNING: Restarting $DAEMON_NAME"
                fi
            done
        ) &
        echo $! > $PIDFILE
    ;;        

    stop)
        echo "Stopping $DAEMON_NAME"
        echo "false" > $STATUSFILE
        [ -f $PIDFILE ] && kill $(<$PIDFILE)
        [ -f $PIDFILE ] && kill $(<$PIDFILE)
        ;;
于 2017-08-09T13:30:57.180 回答