这是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
的PIDrunuser
产生runuser
过程最后
bash
生成bash
[一]
大多数二进制应用程序本身不作为背景,因此
sleep
是这个示例的一个很好的替代品。显然,为了适应您的情况,您可以用您想要使用的任何程序替换sleep
。[二]
似乎应该有更好的方法来后台程序化,而不需要使用这个特定的后台程序函数。
关于bash - 使用RHEL的`daemon` init.d函数时,如何捕获PID?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38103163/