
我有一個 C 程序,我想將其作為守護程序運行。我正在 ubuntu 14.04LTS 工作。哪一種方法是正確的?有人可以幫忙嗎?
答案1
現在,Ubuntu 給了答案。
正確的方法是在 Ubuntu 14 附帶的守護程序管理器下daemon()
。諷刺的是,Ubuntu 已經推出了三個 LTS 版本事先的到版本 14 LTS——事實上是從 2006 年的 Ubuntu 6.10 開始。從那時起,它就有了這樣或那樣的守護程序管理器。
對於擁有適當服務管理的人來說,正確的答案是:不要打電話daemon()
給你不要採取特殊步驟「成為守護程式」。對某些人來說,自 20 世紀 90 年代初以來,這一直是正確的答案。即使是 2006 年,這個聚會也顯得有些遲了。 ☺ 即便如此,對於 Ubuntu 來說,這絕對是過去十年的正確答案。
你所做的很簡單。您設定了一個新貴「作業」文件,告訴新貴何時以及如何呼叫您的程式。新貴叫它已經被惡魔化了,沒有控制終端,並且具有可預測且不變的初始過程狀態。你的程式沒有什麼特別的並簡單地運行,以正常方式將日誌和錯誤訊息寫入標準錯誤。您可以在作業文件中排程 upstart 如何處理寫入標準錯誤的內容。
這新貴食譜詳細描述了所有這些,包括控制啟動事件和日誌處理的各個節。這裡和 AskUbuntu 上有很多關於這個主題的內容。
請做好準備,如果您稍後升級到 Ubuntu 16 LTS,世界將會發生巨大的變化。但即便如此在程式碼中不執行任何特殊操作,只需在守護程式管理器下執行仍將是正確答案。
進一步閱讀
- 詹姆斯·亨特和克林特·拜魯姆 (2014)。 “安慰”。 新貴食譜。
- https://unix.stackexchange.com/a/200281/5132
- 在裡面Ubuntu 14.04 手冊頁。典範。
- 喬納森·德博因·波拉德 (2001)。 設計 Unix 守護程式時要避免的錯誤。經常給的答案。
- https://superuser.com/a/723333/38062
- https://askubuntu.com/a/613814/43344
答案2
如果您的問題是從終端運行程序,這裡有一些方法(您的程式不得要求任何使用者輸入):
使用
nohup
:nohup program > program.log 2>program.err &
。然後您可以退出終端。使用
atd
服務:echo "program > program.log 2>program.err" | at now
或echo "program > program.log 2>program.err" | batch
。作為啟動腳本的服務。
如果您的程式要求使用者輸入,那麼將無法在終端之外運行它,最好是使用screen
或tux
會話,然後將其與終端分離。