Upstart

新貴和多信號關斷過程

  • February 23, 2016

我在 Ubuntu 上執行 resque worker 服務,我想使用 upstart(Ubuntu 的預設程序管理器)來管理它。

resque worker 的正確關閉順序是先發送QUIT信號,然後等待程序首先完成任何正在執行的作業。然後它應該自行停止。如果工作人員沒有及時關閉 - 因為作業仍在執行(可能卡住),我需要發送一個TERM信號,這將導致工作程序中止工作並退出。顯然,如果這不起作用,則KILL必鬚髮送信號。

我認為實現這一點的方法是pre-start script發送QUIT信號然後休眠,直到程序存在或超時到期。

但實際上發生的情況是,如果工作人員響應QUIT並退出,respawn啟動並重新啟動程序,這顯然會導致停止程序不會發生。

如果我們無論如何都停止這個過程,有沒有辦法讓暴發戶不重生?

我發現有兩種方法可以解決這個問題,但都不是完美的:

  1. 新貴有kill signal節。如果你設置了kill signal QUITand kill timeout 600,Upstart 將發送SIGQUIT到程序,然後等待 600 秒再發送SIGKILL。如果程序在發送之前終止SIGKILL,那麼我們很好。這種方法存在問題:(a)它發送SIGKILL而不是SIGTERM在超時之後發送,這不允許 resque 工作人員很好地關閉,但這沒什麼大不了的。(b) 我發現的一個更糟糕的問題是 upstart 向SIGQUIT會話中的所有程序發送“終止信號”(在我們的例子中),這可能會干擾 resque worker 的子程序的操作(SIGQUIT預設操作是終止帶有核心轉儲)。
  2. 實現您自己的包裝器,該包裝器擷取您配置的新貴發送的任何信號(或假設預設值SIGTERM)並自己處理所有正常關閉。在這種情況下,將 Upstart 設置kill timeout為足夠的時間以讓您的包裝器優雅關閉並在時間到時強制中止(在這種情況下確保超時略小於 Upstart 的)或僅依靠新貴SIGKILL用於清理(根據您的要求,這可能是一個好主意,也可能不是一個好主意)。缺點:要做到這一點相當複雜,Upstart 存在的原因是您不必自己為每個服務編寫流程管理器。

如果您不想採用任何一種方式,那麼還有其他流程管理器可能會實現比 Upstart 支持更複雜的信號機制,並且這些通常在 Upstart 下很容易實現,以管理您遇到問題的流程. 不幸的是,很難找到一個在所有情況下都能正常工作的。例如,我嘗試過Bluepill,它在紙上看起來很棒,但在撰寫本文時有一個明顯的錯誤,如果您嘗試具有多個信號和多個超時的複雜信號機制,它只會一次發送所有信號(不一定在正確的順序)並使子程序崩潰。

如果其他人有更多資訊要添加,請隨時添加更多答案,如果它很好,我什至可以將其標記為“已回答”(而不是我自己的答案)。

引用自:https://unix.stackexchange.com/questions/237008