5

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

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

4

3 回答 3

8

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

您需要注意的是过时的 PID 文件,例如,如果锁定文件在重新启动后仍然存在。该逻辑最好在 init 脚本本身中实现,因此--exec可以选择start-stop-daemon.

例如,如果/var/run/foo.pidis 1234,并且/proc/1234/exe不是您的服务,则锁定文件已过时,应悄悄删除,以允许服务正常启动。

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

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

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

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

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

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

于 2010-04-29T08:57:12.580 回答
1

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

于 2010-04-29T09:02:55.993 回答
1

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

  1. 在您的程序中使用getpid将其写入可配置文件(可能在 ENV 中查找)
  2. 使用美元!启动程序后(虽然这对我在archlinux上不起作用:-?)
  3. 启动程序后,使用pidof
于 2010-04-29T09:05:13.820 回答