如何获取从init.d运行的Linux守护进程的pid

5

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

但是我不确定如何捕获守护进程的pid并将其存储在/var/run/.pid的pid文件中,以便我可以使用该pid进行终止操作。我应该怎么做呢?


不太确定这是否适合在 SF 上发布。听起来他已经编写了一个服务,并希望使用适当的 init 脚本进行部署。 - Tim Post
3个回答

8
尝试在您的init脚本中使用start-stop-daemon(8)--pidfile参数。让您的程序将其PID写入指定位置(通常在配置文件中确定)。
您需要注意的是陈旧的PID文件,例如,如果锁定文件持续存在于重新启动过程中。最好在init脚本本身中实现该逻辑,因此start-stop-daemon选项中有--exec选项。
例如,如果/var/run/foo.pid1234,并且/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

除了持续地向文件写入内容外,所有这些逻辑都应该在您的应用程序之外处理。


@Tim Post,但是这个选项只是检查守护进程是否已经在运行中,决定是否启动。我想知道是否有一种标准的方法将pid写入/var/run/目录下。 - Sirish
@Sirish - 只需测试文件是否存在,如果不存在则创建它,写入PID并关闭它。如果它已经存在,则非常有可能服务器已经在运行中。在 init 脚本中测试过期的锁定文件要容易得多。 - Tim Post
@Sirish - 我更新了我的回答,我认为这是你想要的? - Tim Post

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

1
你可以有多种方法:
  1. 在程序中使用getpid将其写入可配置文件(可能查找ENV)
  2. 在启动程序后使用$!(但在archlinux上这对我不起作用:-?)
  3. 启动程序后,使用pidof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接