【问题标题】:How to capture pid of a linux daemon run from init.d如何捕获从 init.d 运行的 linux 守护进程的 pid
【发布时间】:2010-04-29 08:54:09
【问题描述】:

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

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

【问题讨论】:

  • 不太确定这是否属于 SF。听起来他写了一个服务,想用一个合适的初始化脚本来发布它。

标签: linux pid


【解决方案1】:

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

您需要注意的是过时的 PID 文件,例如,如果锁定文件在重新启动后仍然存在。该逻辑最好在初始化脚本本身中实现,因此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 - 只需测试文件是否存在,如果不存在则创建它,写入 PID 并关闭它。如果它存在,那么服务器很有可能已经在运行。在 init 脚本中测试过时的锁定文件要容易得多。
  • @Sirish - 更新了我的答案,我认为这是你想要的吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-05-13
      • 2014-12-11
      • 1970-01-01
      • 2016-05-08
      • 2014-10-10
      • 1970-01-01
      • 2014-08-29
      • 2023-03-02
      • 1970-01-01
      相关资源
      最近更新 更多