服務停止是同步的還是非同步的?
我
sudo service ... stop
在通過 SSH 遠端關閉機器之前做過,但後來我意識到我不知道是否stop
是同步的,我想知道我是不是太快無法關閉 Ubuntu 機器。那麼我的恐懼是不是基於錯誤的預感?
編輯:我的服務是個人服務,它從埠接收監聽內容並不時將內容寫入數據庫。如果服務突然停止,我擔心事情沒有時間刷新。
stop
照顧沖洗的東西,但考慮到它可能需要的時間……
這取決於您的服務如何停止。只有您知道:服務啟動和停止方法是您應該為您的服務使用者記錄的東西,並且最好提供。
如果您的服務通過呼叫
kill
shell 腳本向其發送信號而停止,則這是非同步的。命令或系統呼叫向kill
程序發送信號並立即返回。程序沒有回調機制來通知它已對信號進行了滿意的處理。所以你需要找到另一種方法來表示你已經完成了。許多方法都是可能的,例如讓服務創建或刪除文件,控制腳本監視該文件的更改。然而,他們往往很尷尬。如果您在服務完成時需要回饋,則從不相關的程序發送信號不是一個很好的方法。
如果您的服務通過
stop
Upstart 服務描述中的指令停止,Upstart 會向程序發送信號。Upstarts 然後等待幾秒鐘讓程序停止。因為 Upstart 是程序的父程序,所以它會在程序退出時收到來自核心的通知(一個 SIGCLD 信號)。這僅在程序不分叉以將自己置於後台時才有效;Upstart 服務描述通常呼叫守護程序,並帶有一個選項告訴它們不要分叉(例如ssh -D
)。高級服務有一個限制命令。當您呼叫 throttling 命令時,它們會停止接受新連接。當所有掛起的連接都關閉時,服務會向限制命令發送肯定回复,然後退出。通信方法通常是 Unix 或 IP 套接字。
確保您的應用程序
- 將其正確關閉記錄到 syslog,有關詳細資訊,請
man 3 syslog
參閱- 通過將所有需要的內容寫入數據庫、關閉連接和
exit
ing 來處理 SIGTERM;詳情見man 2 sigaction
_- 在 /etc/init.d 中有一個工作停止處理程序;見
man init
和man stopping
然後您就不必猜測您的應用程序是否正確停止,您就會知道。