2014-01-28 214 views
3

我想從我的程序中找到一種啓動自定義守護進程的方法。守護進程本身使用雙分叉機制實現,如果直接啓動,則工作正常。通過C++代碼在Linux上啓動/停止守護進程

到目前爲止,我所遇到的各種方式啓動一個守護進程:

  1. 創建一個初始化腳本,並安裝它的init.d目錄。
  2. 使用start-stop-daemon命令啓動程序。
  3. 創建.desktop文件並放置在其中一個自動啓動路徑中。

雖然已知前2種方法使用命令行啓動服務,但第三種方法是在用戶登錄時自動啓動服務(或任何其他應用程序)。

到目前爲止,我的猜測是程序可以使用exec()系列函數直接執行,或者可以通過system()函數執行'start-stop-daemon'命令。

有沒有更好的方法來啓動/停止服務?

+2

您正在尋找_better_方式;請告訴我們在哪些方面可以採取不同的方式。更便攜?執行速度更快?較短的代碼?針對特殊情況更強大?其他方面? – Alfe

+0

我不確定這是否是建議的方式。我是Linux編程新手,找不到任何關於以編程方式啓動守護進程的方法 – skaur

+0

我看到的最常見的方法是,準備一個shell腳本,爲守護進程準備環境(導出env vars,創建日誌目錄等),然後在最後調用你的二進制文件。一旦你的可執行文件進入守護進程模式,檢查返回狀態後退出shell腳本 – Arunmu

回答

0

一般情況下,初始化都是從shell腳本完成的,這些腳本會調用您的C++程序,然後執行它的雙分叉。注意它也應該關閉不需要的文件描述符,使用setsid()和可能的setpgid/setpgrp(我不記得它們是否也適用於Linux),可能是chdir(「/」)等。有一些相當正常的在Stevens書中描述的事情 - 更多信息請參閱http://software.clapper.org/daemonize/daemonize.html

如果守護程序應該以root或其他系統用戶帳戶運行,那麼系統將使用/ etc/init /或/etc/init.d /機制是使腳本停止|開始|狀態|等守護進程的適當位置。

如果deamon應該是給用戶的,並在他/她的帳戶下運行,那麼您有幾個選項。 1).desktop文件 - 我個人不是粉絲,但是如果它在註銷時也爲你做了某些事情(比如讓你關閉守護進程),它可能是可行的。

2)對於控制檯登錄,〜/ .bash_login和〜/ .bash_logout - 你可以讓守護進程的包裝程序支持這些運行命令來啓動它並(稍後)將其關閉。後者可以通過將PID保存在文件中或讓.bash_login保存在.bash_logout將在以後使用的變量中完成。這可能涉及到一些調整,以確保兩個腳本每次運行一次,只有最外層的登錄shell(普通的.bashrc保留在.bashrc中,而.bash_login需要在之前爲登錄shell 讀入它)啓動守護進程,所以PATH等將在那時建立)。

3)對於圖形環境,您需要找到運行X窗口管理器等事情的包裝腳本。我正在使用lightdm,並且在某個時候/etc/X11/Xsession.d/40x11-common_xsessionrc最終運行了我的〜/ .xsessionrc,它給了我一個啓動任何我想要的東西的鉤子(我已經運行了我的〜/ .xinitrc其中運行我的窗口管理器和所有內容),以及稍後將所有內容拍攝下來的地方。由於缺乏用戶控制的標準化使得找到鉤子非常煩人,因爲只使用不同的登錄管理器(例如lightdm和gdb)可以改變鉤子的位置。

4)完全不同的方法是讓用戶的crontab啓動守護進程。運行「man 5 crontab」並查找特殊的@reboot選項以使任務在啓動時運行。我自己並沒有使用過它 - 它有一個根限制的機會,但它很容易測試,並且只需要考慮當系統發送一個SIGTERM信號時,系統關閉時守護進程會優雅(快速)存在(請參閱/ etc/init.d/sendsigs的細節)。

希望從中幫助。

+0

這些信息相當有幫助,但我一直在尋找有關最佳/推薦方法的信息,以便從程序(最好有其自己的GUI)執行它(如果可能),並且具有相同的原因 – skaur