使用 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的使用