2016-02-05 94 views
-3

我需要啓動服務並(稍後)檢測它是否在C++程序中運行。有沒有比調用具有合適參數的systemctl和解析輸出更簡單的方法?以編程方式啓動systemd服務或測試運行的服務

服務的來源完全在我的控制之下。 (目前,它是寫在bash,但一個C++包裝是完全可能的。)

(我在的DBus有過一次短暫的樣子 - 這顯然是很強大,但失敗了「簡單」的測試。)

服務的來源完全在我的控制之下。 (目前它是用bash編寫的,但C++完全有可能)。

該代碼適用於運行Debian Jessie變體的嵌入式設備。可移植性不是主要關心的問題(但顯然如果可移植的話,答案對其他人更有用)。

+0

爲什麼你需要檢測服務是否仍在運行?何時以及爲何該服務停止運行?你在說什麼確切的服務? –

+0

主程序本身就是一個可以自動更新的服務。顯然,更新過程涉及重新啓動主服務。通過將更新過程作爲單獨的(一次性)服務創建,它位於單獨的cgroup中,並且不會因殺死主要服務而中止。當主服務啓動並發現我們處於UPDATE模式時,它想知道更新服務是否仍在運行或者是否已崩潰。 –

+0

這仍然不能告訴我們你的神祕服務是什麼服務....你應該**編輯你的問題**,而不是評論它! –

回答

0

大多數程序都是以其他方式編寫的(即使是在系統前的日子裏)。

典型服務(那些,並開始與一個服務器進程)在一些/var/run/foobar.pid文件在它們的啓動正在寫自己的PID(作爲一個單行的ASCII數)。如果您在服務中採用這樣的約定,則可以使用fscanf來讀取該文件,然後檢查該過程是否正在運行kill(pid, 0);(當然,您不能確定它是否是相同的服務,但它可能是)。

我已經把現在超過20個文件匹配/var/run/*.pid,特別是/var/run/sshd.pid & /var/run/atd.pid

因此,假設你可以提高你的服務FooBar的(如果該功能是不存在的)的代碼,其代碼更改爲把它的pid寫入/var/run/foobar.pid;這是一個記錄的convention

如果您可以更改服務,您可能會提供一些pingnop功能;所以你可以添加一些RPC工具來檢查服務是否正在運行(並且還可以提供一些附加信息,如程序的版本等)。大多數現有的Linux服務都具有此功能。

+1

1.不解決「啓動服務」部分(但爲此調用systemctl非常簡單)。 2.我原則上不喜歡PID文件。他們證明這個過程開始了,'kill('pid',0);'測試證明了一個具有該PID的進程正在運行......但它並不證明它是*相同的進程(並且只有我的Linux上有32767個獨特的PID)。 OTOH,這可能是我能做的最好的事情:-( –