supervise是守护工具中最强大的工具之一,我想知道如何使用bash脚本来实现它。有谁有建议吗?我需要帮助!
发布于 2013-01-16 03:11:13
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可能会做到这一点,参见how to use inittab to auto-restart a PHP programme?获取一些提示。否则,我们将脱离堆栈溢出的领域,所以请查看https://unix.stackexchange.com/。
发布于 2017-08-09 21:30:57
我对the code provided by 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)
;;https://stackoverflow.com/questions/14341226
复制相似问题