我有bash脚本做某事,(例如:)
[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
它与主管有关。 我想添加,如果签入此脚本以确定它是否执行:
或
我想要这样的东西:
if [ executed by start command ]
then
echo "start"
else
echo "restart"
fi
但我不知道if子句应该包含什么内容。 有可能确定这个吗? 如果没有,如何为启动和重启命令实现脚本的不同行为? 请帮忙。
答案 0 :(得分:1)
在代码中,重启和停止/启动之间没有电流差异。在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
这意味着每当我们从supervisord发送一个停止时,作为纪元的日期将被记录在文件/var/run/long/last.stop中
然后,作为脚本中的下一行,计算最后一站与现在
之间的差异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。
然后可以用它来决定做什么:
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秒,任何更大的被认为是“开始”。如果脚本的关闭需要以特定的方式发生,那么在trap语句中需要更多的复杂性(而不仅仅是exit 0
由于崩溃不应该将任何时间戳记录到停止文件,因此如果您还经常在某个地方记录正在运行的时间戳,您应该能够告知正在发生启动。
答案 1 :(得分:0)
我理解你的问题。但我不知道主管。请检查这个想法是否有效。
在输入supervisor命令之前,实例化一个全局字符串变量并将值放入变量。在这里,我将每个启动和重启命令作为两个bash程序。
程序:supervisor_start.sh
#!/bin/bash
echo "Starting.."
supervisor> start long_script
supervisor_started_command="start" # This is the one
echo "Started.."
程序:supervisor_restart.sh
#!/bin/bash
echo "ReStarting.."
supervisor> restart long_script
supervisor_started_command="restart" # This is the one
echo "ReStarted.."
现在您可以看到“supervisor_started_command”变量:)
中的内容#!/bin/bash
if [ $supervisor_started_command == "start" ]
then
echo "start"
elif [ $supervisor_started_command == "restart" ]
echo "restart"
fi
嗯,我不知道这个想法是否适合你。