Service

Upstart 沒有將 CONT 發送到我的已停止守護程序,該守護程序配置為使用“期望停止”

  • November 18, 2014

我有以下針對新貴服務的測試配置文件,在 Ubuntu 14.04 上執行:

expect stop
chdir /home/joe/Projects/Marketplace
env RAILS_ENV="development"
script
 ruby -e "STDOUT.sync=true; puts 'loading...'; sleep 5; Process.kill(:STOP, Process.pid); 5.times { puts 'running'; sleep 3 }" > /tmp/upstart_test.log
end script

嵌入的 ruby​​ 腳本只休眠 5 秒(模擬載入),然後向自身發送一個 STOP 信號,以通知 Upstart 它已準備好,然後列印“執行”幾次(模擬某些服務發生)。哇,酷極了。這麼簡單。

問題是,當我用 啟動這個“服務”時start fake-service,該命令掛起(等待服務完成啟動),並且程序最終處於停止狀態,Upstart 從未確認或發送“CONT”。

是什麼賦予了??

更新: exec 有幫助,但分叉仍然失敗

我發現,如果在配置文件中,我使用 exec 而不是腳本塊來執行啟動“守護程序”的命令,它就可以正常工作:

expect stop
chdir /home/joe/Projects/Marketplace
env RAILS_ENV="development"
exec ruby -e "STDOUT.sync=true; puts 'loading...'; sleep 5; Process.kill(:STOP, Process.pid); 5.times { puts 'running'; sleep 3 }" > /tmp/upstart_test.log

但是,如果我在腳本中包含一個 fork(這是expect stop我認為首先使用的全部要點 - 幫助 Upstart 輕鬆確定主程序 PID):

expect stop
chdir /home/joe/Projects/Marketplace
env RAILS_ENV="development"
exec ruby -e "STDOUT.sync=true; puts 'loading...'; sleep 5; fork { Process.kill(:STOP, Process.pid); 5.times { puts 'running'; sleep 3 } }; Process.wait" > /tmp/upstart_test.log

Upstart 文件確實有一個關於在腳本塊中使用 expect 的警告,但它特別談到在塊中執行多個命令是有問題的,因為它不知道該看哪一個。在這種情況下,我只執行一個命令……所以這沒有幫助。

事實證明,我相信,我的理解expect stop是不正確的!如上所述,我認為它被用來(像其他expect節一樣)“幫助 Upstart 輕鬆確定主程序 PID”。

現在我重新閱讀了文件,我相信它的意思是,它所說的“指定作業的主程序將引發 SIGSTOP 信號以指示它已準備好”,是由 upstart 執行的原始程序具有發出 STOP 信號,該信號用於確定作業何時準備就緒。所以這一expect節與其他兩節無關,後者用於確定包含分叉的作業的主 PID。

它對腳本塊​​不起作用的原因是腳本塊本身派生了一個新的外殼來執行其內容,因此主程序實際上是在塊內執行的任何命令的父程序。

現在一切都變得更有意義了:)

引用自:https://serverfault.com/questions/644989