在代碼中,重新啓動和停止/啓動之間沒有電流差異。在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併產生一個新的進程,你應該能夠找到它的父代。 –