2017-04-05 73 views
1

我的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 

,并为界,监事。 我想补充,如果在此脚本来确定检查它通过执行:

  • 主管>启动long_script

  • 主管>重启long_script

我想要那样的东西:

if [ executed by start command ] 
then 
    echo "start" 
else 
    echo "restart" 
fi 

但我不知道if子句应该是什么。 有没有可能确定这一点? 如果不是,如何实现启动和重启命令的脚本的不同行为? 请帮忙。

+0

是否手动执行'supervisor> ... ...'命令? –

+0

这很大程度上取决于启动和重新启动的操作,以及它们是什么(bash函数,外部程序)如果它们是一个progeam并产生一个新的进程,你应该能够找到它的父代。 –

回答

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 

这意味着日期时代将被记录在文件/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

由于崩溃不应该记录停止文件的任何时间戳,因此您应该如果您还定期记录某个运行时间戳,则可以分辨出是因为崩溃而发生启动。

0

我明白你的问题。但我不知道主管。请检查这个想法是否有效。

在输入管理员命令之前,实例化一个全局字符串变量并将值赋予该变量。在这里,我将你的每个启动和重新启动命令作为两个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 

好,我不知道这个想法是否适合你..