我已經啓動了一個服務守護進程,通過運行二進制文件(用C++編寫)通過存儲rc5.d的腳本文件。如何捕獲從init.d運行的Linux守護進程的pid
但我不確定如何捕獲守護進程的pid並將其存儲在/var/run/.pid中的pid文件中。這樣我可以使用該pid進行終止。 我該怎麼做?
我已經啓動了一個服務守護進程,通過運行二進制文件(用C++編寫)通過存儲rc5.d的腳本文件。如何捕獲從init.d運行的Linux守護進程的pid
但我不確定如何捕獲守護進程的pid並將其存儲在/var/run/.pid中的pid文件中。這樣我可以使用該pid進行終止。 我該怎麼做?
嘗試在初始化腳本中使用start-stop-daemon(8)
和--pidfile
參數。讓程序將其PID寫入指定的位置(通常在配置文件中確定)。
例如,如果鎖定文件在重新啓動時持續存在,您必須注意的是過時的PID文件。該邏輯最好在init腳本中實現,因此--exec
選項爲start-stop-daemon
。
例如,如果/var/run/foo.pid
是1234
,並且/proc/1234/exe
不是您的服務,則鎖定文件已過時並且應該安靜地移除,從而允許服務正常啓動。
就你的應用程序而言,只要確保lockfile的位置是可配置的,並且有一些方法可以告訴init腳本將它放在哪裏。
例如:(樣品:在/ etc /默認/富):
PIDFILE=/var/run/foo.pid
OTHEROPTION=foo
然後在/etc/init.d/foo:
[ -f /etc/default/foo ] && . /etc/default/foo
同樣,比寫至另一文件一致,所有這些邏輯應該在應用程序之外處理。
@Tim Post,但是這個選項只檢查是否啓動守護進程,如果它已經在運行。我想要有任何標準的方式將pid寫入/ var/run/ – Poorna 2010-04-29 09:09:14
@Sirish - 只需測試以查看文件是否存在,如果不存在則創建它,寫入PID並關閉它。如果存在,服務器很可能已經運行。在初始化腳本中測試陳舊的鎖文件更容易。 – 2010-04-29 09:11:25
@Sirish - 更新了我的答案,我想_你想要什麼? – 2010-04-29 09:19:22
如果您知道程序已打開的端口,請使用fuser
命令確定pid。
不是很確定這屬於對SF。這聽起來像他寫了一個服務,並希望用適當的初始化腳本運送它。 – 2010-04-29 09:01:30