0

supervise は daemontools の強力なツールの 1 つですが、bash スクリプトを使用してどのように実装するのだろうか。誰にも提案がありますか?私は助けが必要です!

4

2 に答える 2

1

superviseは多くのタスクを実行し、 、 、 と相互運用svscansvcokます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 を閉じますが、ロガー/syslog を介してログを記録するため、何をしているかを確認できます。$DAEMONがバックグラウンド自体に fork しないことを前提としています ( のようにsupervise)。

プラットフォームについては述べていませんが、本当に簡単なものが必要な場合は、inittab でうまくいくかもしれません。inittab を使用して PHP プログラムを自動再起動する方法を参照してください。いくつかのヒントについて。そうしないと、スタック オーバーフローの領域から外れてしまうので、 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 に答える