使用 RHEL 的 `daemon` init.d 函数时,如何捕获 PID?

Posted

技术标签:

【中文标题】使用 RHEL 的 `daemon` init.d 函数时,如何捕获 PID?【英文标题】:When using RHEL's `daemon` init.d function, how do you capture the PID? 【发布时间】:2016-11-01 08:55:39 【问题描述】:

这是RedHat daemon function usage 的后续行动。在接受的解决方案中,作者指出“$! 在使用 [功能] daemon [来源自 /etc/rc.d/init.d/functions] 时不可用”。所以我的后续问题是关于获取 PID。

如果要使用来自/etc/rc.d/init.d/functions 的函数daemon,如何获取PID?

【问题讨论】:

【参考方案1】:

您需要创建一个包装器 shell 脚本,它使您的程序成为后台并使用 $! 捕获 PID,然后将包装器 shell 脚本传递给 daemon 函数。

在不使用来自 /etc/rc.d/init.d/functions 的函数 daemon 的情况下,可能有更优雅的方式来守护程序,但这个问题/答案是关于使用这个 daemon 函数的。 [2]


以下是原因的低级逐步说明:

我将使用sleep[1] 作为您希望使用来自/etc/rc.d/init.d/functions 的函数daemon 进行守护的任何程序的替代。

您需要创建一个以sleep 为背景并通过$! 获取PID 的包装shell 脚本。例如,您的 sleep_wrapper.sh 将是:

#!/bin/bash
sleep 100 &
PID=$!
echo $PID

然后你将这个包装器传递给daemon via:

daemon sleep_wrapper.sh

如果您天真地尝试调用daemon sleep 100,然后调用PID=$!,您将不会获得进程sleep 的PID,而是:

您将获得runuser 的PID runuser 产生 bash 进程 终于bash产生sleep

[1] 大多数二进制应用程序不会自己后台运行,因此sleep 是此示例的一个很好的替代品。显然,为了适应您的情况,您可以将 sleep 替换为您想要使用的任何程序。

[2] 似乎应该有更好的方法来守护不涉及使用这个特定的守护函数。

【讨论】:

这不是很明显,真的需要问答吗? @123 查看您的个人资料,您似乎对 bash 非常有经验,所以这可能很明显。但对我来说,这绝对不是显而易见的。我第一次使用这个功能时我自己用错了,所以我不希望其他人有同样的问题。 (此外,几乎不存在文档,并且您在 google 或 *** 上找到的信息通常谈论不同的 daemon,因此天真的 googler 可能会将这些信息与来自 Redhat /etc/rc.d/init 的特定 daemon 混为一谈.d/函数。) 嗯,很公平:)

以上是关于使用 RHEL 的 `daemon` init.d 函数时,如何捕获 PID?的主要内容,如果未能解决你的问题,请参考以下文章

rsync服务端启动报错rsync: link_stat "/etc/rc.d/init.d/–daemon" failed: No such file or directory

linux 下xinetd和/etc/init.d里的服务不一样吗?为啥要设置这两个?

centos中nginx启动显示daemon +或- niceleve

#24 centos6(RHEL)系列操作系统的启动流程与命令chkconfiggrub的使用

如何将 init.d 脚本从 Ubuntu/Debian Linux 转换为 Solaris?

Linux基本功杂记——[021]——『rhel6系列的开关机脚本』