Services

服務停止是同步的還是非同步的?

  • September 6, 2013

sudo service ... stop在通過 SSH 遠端關閉機器之前做過,但後來我意識到我不知道是否stop是同步的,我想知道我是不是太快無法關閉 Ubuntu 機器。

那麼我的恐懼是不是基於錯誤的預感?

編輯:我的服務是個人服務,它從埠接收監聽內容並不時將內容寫入數據庫。如果服務突然停止,我擔心事情沒有時間刷新。stop照顧沖洗的東西,但考慮到它可能需要的時間……

這取決於您的服務如何停止。只有您知道:服務啟動和停止方法是您應該為您的服務使用者記錄的東西,並且最好提供。

如果您的服務通過呼叫killshell 腳本向其發送信號而停止,則這是非同步的。命令或系統呼叫向kill程序發送信號並立即返回。程序沒有回調機制來通知它已對信號進行了滿意的處理。所以你需要找到另一種方法來表示你已經完成了。

許多方法都是可能的,例如讓服務創建或刪除文件,控制腳本監視該文件的更改。然而,他們往往很尷尬。如果您在服務完成時需要回饋,則從不相關的程序發送信號不是一個很好的方法。

如果您的服務通過stopUpstart 服務描述中的指令停止,Upstart 會向程序發送信號。Upstarts 然後等待幾秒鐘讓程序停止。因為 Upstart 是程序的父程序,所以它會在程序退出時收到來自核心的通知(一個 SIGCLD 信號)。這僅在程序不分叉以將自己置於後台時才有效;Upstart 服務描述通常呼叫守護程序,並帶有一個選項告訴它們不要分叉(例如ssh -D)。

高級服務有一個限制命令。當您呼叫 throttling 命令時,它們會停止接受新連接。當所有掛起的連接都關閉時​​,服務會向限制命令發送肯定回复,然後退出。通信方法通常是 Unix 或 IP 套接字。

確保您的應用程序

  1. 將其正確關閉記錄到 syslog,有關詳細資訊,請man 3 syslog參閱
  2. 通過將所有需要的內容寫入數據庫、關閉連接和exiting 來處理 SIGTERM;詳情見man 2 sigaction_
  3. 在 /etc/init.d 中有一個工作停止處理程序;見man initman stopping

然後您就不必猜測您的應用程序是否正確停止,您就會知道。

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