2014-02-20 34 views
0

我們使用Upstart來啓動/終止內部開發的二進制文件。讓Gnu Screen將SIGTERM信號傳遞給子進程,允許它們乾淨地關閉

在這個二進制新貴配置文件,我們定義腳本,例如:

script 
    exec su - user -c "screen -D -m -S $product /opt/bin/prog /opt/cfg/$product -v 5 --max_log_size=7" 
end script 

當運行級別設置爲5,新貴啓動腳本。運行級別設置爲3時,Upstart終止腳本。

我的問題是,Upstart發送SIGTERM,然後SIGKILL。

SIGTERM由屏幕「處理」,而不是由我的自定義二進制文件處理,所以我們的二進制信號處理程序不會得到SIGTERM,因此無法乾淨地關閉。

我已驗證我們的二進制信號處理程序確實允許它在通過屏幕不啓動時乾淨地關閉。

回答

0

原來,我不得不從另一個角度來看待這個問題,並通過Upstart處理它。增加了一個預停腳本,允許我識別屏幕會話,然後填入命令(「quit \ n」,然後「y \ n」)以乾淨地關閉屏幕正在運行的二進制文件。

pre-stop script 
    SESSID=`ps -elf | grep '/opt/bin/prog /opt/cfg/$product' | grep SCREEN | awk '{print $4}'` 
    QUIT_CMD="screen -S $SESSID.$product -X stuff \"exit"$'\n'"\"" 
    exec `su spuser -c "$QUIT_CMD"` 
    QUIT_CMD="screen -S $SESSID.$product -X stuff \"y"$'\n'"\"" 
    exec `su spuser -c "$QUIT_CMD"` 
    sleep 20 
end script