如何捕获从init.d运行的linux守护进程的pid

时间:2010-04-29 08:54:09

标签: linux pid

我已经通过存储rc5.d的脚本文件运行二进制文件(用C ++编写)启动了一个服务守护进程。

但我不知道如何捕获守护进程的pid并将其存储在/var/run/.pid中的pid文件中。这样我就可以使用pid进行终止。 我怎么能这样做?

3 个答案:

答案 0 :(得分:8)

尝试在初始化脚本中使用带有start-stop-daemon(8)参数的--pidfile。让程序将其PID写入指定位置(通常在配置文件中确定)。

您需要注意的是陈旧的PID文件,例如,如果锁定文件在重新启动时保持不变。该逻辑最好在init脚本本身中实现,因此--exec的{​​{1}}选项。

例如,如果start-stop-daemon/var/run/foo.pid,并且1234不是您的服务,则锁定文件是陈旧的,应该安静地删除,从而允许服务正常启动。

就您的应用程序而言,只需确保锁定文件的位置是可配置的,并且存在一些方法告诉init脚本将其放在何处。

例如:(示例:/ etc / default / foo):

/proc/1234/exe

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

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

同样,除了一致地写入文件之外,所有这些逻辑都应该在应用程序之外处理。

答案 1 :(得分:1)

如果您知道程序已打开的端口,请使用fuser命令确定pid。

答案 2 :(得分:1)

你可以采取不止一种方式:

  1. 在您的程序中使用getpid将其写入可配置文件(可能在ENV中查找)
  2. 使用$!在启动程序之后(虽然这对我在archlinux上不起作用: - ?)
  3. 启动程序后,使用pidof