这是RedHat daemon function usage的后续报道。在公认的解决方案中,作者指出“$!在使用[函数]daemon[源于/etc/rc.d/init.d/functions]时不可用”。所以我的后续问题是获取PID。
如果您想使用来自/etc/rc.d/init.d/functions的函数daemon,那么如何捕获PID?

最佳答案

您需要创建一个包装外壳脚本,该脚本为您的程序设置背景,并使用$!捕获PID,然后将包装外壳脚本传递给daemon函数。
在不使用源于/etc/rc.d/init.d/functions的函数daemon的情况下,可能有更优雅的方法对程序进行守护,但是这个问题/答案是关于使用这个daemon函数的。[二]
下面是一步一步说明原因的低级别:
我将使用来自/etc/rc.d/init.d/functions的函数sleep[1]作为任何程序的替代。
您需要创建一个包装shell脚本,该脚本将daemon设置为背景并通过sleep获取PID。例如,您的$!将是:

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

然后通过以下途径将此包装传递给sleep_wrapper.sh
daemon sleep_wrapper.sh

如果您天真地尝试调用daemon然后再调用daemon sleep 100,则不会得到进程PID=$!的PID,而是:
您将获得sleep的PID
runuser产生runuser过程
最后bash生成bash
[一]
大多数二进制应用程序本身不作为背景,因此sleep是这个示例的一个很好的替代品。显然,为了适应您的情况,您可以用您想要使用的任何程序替换sleep
[二]
似乎应该有更好的方法来后台程序化,而不需要使用这个特定的后台程序函数。

关于bash - 使用RHEL的`daemon` init.d函数时,如何捕获PID?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38103163/

10-09 09:11