在代码中,重新启动和停止/启动之间没有电流差异。在supervisorctl调用内重新启动:
self.do_stop(arg)
self.do_start(arg)
还有就是应用程序的“重启”中没有状态虽然有允许不同的信号进行了一些讨论。主管已经能够向该过程发送不同的信号。 (允许在重装更多控制/重新起动已经long standing "gap")
这意味着你至少有两个选项,但关键是使这项工作,该进程需要在关机记录一些状态
选项1.最简单的选择是使用supervisorctl signal <singal> <process>
而不是调用supervisorctl restart <process>
并在某处记录发送了什么信号,以便在启动时可以读回最后一个信号。
选项2。然而,一个更有趣的解决方案是不要指望任何上游变化,即继续允许重新启动使用,并区分停止,崩溃和重启
在这种情况下,唯一的信息将在启动和重启是重新启动应该关闭旧进程和新进程开始之间的时间要短得多。因此,如果在关机时记录了时间戳,那么在启动时,现在和上次关机之间的区别将区分开始和重新启动。
要做到这一点,我得到了一个类似于您的定义,但使用了stopignal定义:
[program:long_script]
command=/usr/local/bin/long.sh
autostart=true
autorestart=true
stderr_logfile=/var/log/long.err.log
stdout_logfile=/var/log/long.out.log
stopsignal=SIGUSR1
通过从supervisord特定的信号使停止,你可以告诉崩溃和正常停止事件之间的区别,而不是正常杀干扰或中断信号
然后作为第一行在bash脚本中,我为这个信号设置了一个陷阱:
trap "mkdir -p /var/run/long/; date +%s > /var/run/long/last.stop; exit 0" SIGUSR1
这意味着日期时代将被记录在文件/var/run/long/last.stop每次我们从supervisord
发出了停止然后按照脚本紧跟其后的线条,计算的最后一站之间的差异,现在
stopdiff=0
if [ -e /var/run/long/last.stop ]; then
curtime=$(date +%s)
stoptime=$(cat /var/run/long/last.stop | grep "[0-9]*")
if [ -n "${stoptime}" ]; then
stopdiff=$[ ${curtime} - ${stoptime} ]
fi
else
stopdiff=9999
fi
stopdiff现在将包含停止之间在几秒钟之差,并开始或9999,如果停止文件didnt存在。
这可以被用来决定该怎么做:
if [ ${stopdiff} -gt 2 ]; then
echo "Start detected (${stopdiff} sec difference)"
elif [ ${stopdiff} -ge 0 ]; then
echo "Restart detected (${stopdiff} sec difference)"
else
echo "Error detected (${stopdiff} sec difference)"
fi
你必须做出实际需要多长时间从发送停止的脚本以获得真正开始一些选择:在这里,我只允许2秒,而任何更大的事情都被认为是“开始”。如果需要以特定方式关闭脚本,则需要在陷阱语句中稍微复杂一点(而不是仅仅使用exit 0
由于崩溃不应该记录停止文件的任何时间戳,因此您应该如果您还定期记录某个运行时间戳,则可以分辨出是因为崩溃而发生启动。
是否手动执行'supervisor> ... ...'命令? –
这很大程度上取决于启动和重新启动的操作,以及它们是什么(bash函数,外部程序)如果它们是一个progeam并产生一个新的进程,你应该能够找到它的父代。 –