繼從這個問題,我寫了一個簡單的新貴服務(/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
太長,無法放入問題中,但您查看它這裡。
答案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
答案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