為什麼我的 upstart 服務沒有在系統啟動時啟動?

為什麼我的 upstart 服務沒有在系統啟動時啟動?

繼從這個問題,我寫了一個簡單的新貴服務(/etc/init/pms.conf)對於我的無頭 Ubuntu Server 11.04 盒子,如下所示:

start on filesystem and net-device-up IFACE=eth0
stop on runlevel [016]
respawn

exec /home/administrator/pms-current/PMS.sh

我可以從命令列隨意啟動(或停止)該服務:

service pms start

我可以看到它確實正在運行。

但是,當我第一次啟動機器時,該服務不會啟動。如果我透過 SSH 進入盒子並檢查服務狀態,我會得到:

$ service pms status
pms stop/waiting

我的問題是為什麼會發生這種情況?為什麼我的服務沒有啟動?

更新1:不確定我的服務是否正在啟動並隨後停止,或者根本沒有啟動,我將以下內容添加到 PMS.sh:

echo "STARTED" > $STARTLOG

這顯然只是給了我某物尋找。我透過自己啟動服務然後檢查來測試這一點啟動日誌。然後我刪除了啟動日誌並重新啟動。重新啟動後它就不存在了,所以看起來暴發戶肯定沒有啟動我的服務。我認為它可能會在這個過程的早期階段死亡,但考慮到這一切的簡單性,這似乎不太可能。

更新2:我剛剛升級到11.10,其中包括upstart升級,但仍然出現此問題。

更新3:按照要求,我已經啟動了--debug。 cat 的輸出/var/log/syslog | grep init太長,無法放入問題中,但您查看它這裡

更新4:更多日誌,這次暴發戶conf包含在頂部。運行1運行2

答案1

我建議增加工作的詳細程度,例如使用啟動前/啟動後條目。

pre-start script
  logger "pre-start for myprog"
end script

post-start script
  logger "post-start for myprog"
end script

# and for PMS itself:
script
  logger "just before executing PMS"
  exec /home/administrator/pms-current/PMS.sh
end script

更多資訊請訪問http://upstart.ubuntu.com/cookbook/

還可以看看http://upstart.ubuntu.com/wiki/調試

答案2

這裡可能發生的情況是,pms 在網路適配器啟動之前啟動,甚至可能在環回適配器啟動之前啟動(lo)。假設我們談論的是 PS3 媒體伺服器,它是一項網路服務,可能不喜歡在沒有可用介面的情況下啟動。

嘗試將您的開始標準更改為:

start on filesystem and net-device-up IFACE!=lo

意思是,在任何「真實」網路介面啟動後啟動。然而,這可能並不理想,如果 eth0 是下一個接口,PMS 啟動,但您確實希望 PMS 使用 wlan0,那是行不通的。該服務將啟動,但它可能無法選擇您希望其偵聽的介面。假設您知道要串流的介面並且它不會改變,我會將其硬編碼到作業中,例如:

start on filesystem and net-device-up IFACE=wlan0

在 Oneiric (11.10) 上,您可以使用該事件static-network-up來等待所有靜態配置的裝置。這很好,因為它允許您編寫依賴網路的作業,而無需對介面進行硬編碼。 [注意:“所有靜態配置的設備”,我指的是使用/etc/network/interfaces而不是 NetworkManager。它並不意味著靜態 IP 與 DHCP 意義上的靜態。

答案3

透過檢查您的系統日誌,pms 進程開始時沒有錯誤,但不久之後它的目標從開始變為停止,這意味著它被終止。

這有點奇怪,因為您添加了 resawn 子句,因此它應該在停止後嘗試重新啟動,但它永遠不會這樣做。所以我猜你刪除了重生條款。

在 pms 服務啟動和停止之間,僅啟動 2 個服務(ufw 和網路介面 (eth0)),並啟動 1 個服務 udev-fallback-graphics。

看來您的進程 pms 正在並行啟動。不幸的是,新貴文件對於start on ...vanilla 和start on starting ...之間的確切區別有點模糊start on started ...

嘗試將您的啟動節更改為

start on started networking

或者只是太

start on net-device-up IFACE=eth0

日誌輸出有點奇怪,因為 net-device-up 事件發生得晚得多,但 pms 在其之前啟動。

這應該確保您的進程僅啟動一次全部網路設定已完成,即作業不僅已開始而且已完成。

另外,不要完全信任日誌輸出,在啟動過程的早期,將輸出記錄到任何檔案並不總是有效。請參閱答案調試新貴

答案4

我遇到了同樣的問題,最後我解決了簡單地和:

start on runlevel [2345]

沒有任何net-device-up東西started networking

這是完整的新貴腳本,它運行得很好:

# MyApp

description     "MyApp"
author          "me"

start on runlevel [2345]
stop on runlevel [016]

respawn

exec /usr/bin/myapp 2>> /var/logs/myapp.log

相關內容