supervise 是 daemontools 中的强大工具之一,我想知道如何使用 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,但它确实通过 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 回答