2017-04-05 74 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 

好,我不知道這個想法是否適合你..