2010-04-29 141 views
5

我已經啓動了一個服務守護進程,通過運行二進制文件(用C++編寫)通過存儲rc5.d的腳本文件。如何捕獲從init.d運行的Linux守護進程的pid

但我不確定如何捕獲守護進程的pid並將其存儲在/var/run/.pid中的pid文件中。這樣我可以使用該pid進行終止。 我該怎麼做?

+0

不是很確定這屬於對SF。這聽起來像他寫了一個服務,並希望用適當的初始化腳本運送它。 – 2010-04-29 09:01:30

回答

8

嘗試在初始化腳本中使用start-stop-daemon(8)--pidfile參數。讓程序將其PID寫入指定的位置(通常在配置文件中確定)。

例如,如果鎖定文件在重新啓動時持續存在,您必須注意的是過時的PID文件。該邏輯最好在init腳本中實現,因此--exec選項爲start-stop-daemon

例如,如果/var/run/foo.pid1234,並且/proc/1234/exe不是您的服務,則鎖定文件已過時並且應該安靜地移除,從而允許服務正常啓動。

就你的應用程序而言,只要確保lockfile的位置是可配置的,並且有一些方法可以告訴init腳本將它放在哪裏。

例如:(樣品:在/ etc /默認/富):

PIDFILE=/var/run/foo.pid 
OTHEROPTION=foo 

然後在/etc/init.d/foo:

[ -f /etc/default/foo ] && . /etc/default/foo 

同樣,比寫至另一文件一致,所有這些邏輯應該在應用程序之外處理。

+0

@Tim Post,但是這個選項只檢查是否啓動守護進程,如果它已經在運行。我想要有任何標準的方式將pid寫入/ var/run/ – Poorna 2010-04-29 09:09:14

+0

@Sirish - 只需測試以查看文件是否存在,如果不存在則創建它,寫入PID並關閉它。如果存在,服務器很可能已經運行。在初始化腳本中測試陳舊的鎖文件更容易。 – 2010-04-29 09:11:25

+0

@Sirish - 更新了我的答案,我想_你想要什麼? – 2010-04-29 09:19:22

1

如果您知道程序已打開的端口,請使用fuser命令確定pid。

1

你可以去不止一種方法:

  1. 在程序中使用getpid將其寫入到一個配置文件(ENV也許看)
  2. 使用$!啓動程序後(這不適合我的工作的archlinux不過: - ?)
  3. 啓動程序後,使用pidof
相關問題