supervise は daemontools の強力なツールの 1 つですが、bash スクリプトを使用してどのように実装するのだろうか。誰にも提案がありますか?私は助けが必要です!
質問する
486 次
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 を閉じますが、ロガー/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 に答える