这是RedHatdaemon
函数用法的后续。在接受的解决方案中,作者指出“$!
在使用 [函数] daemon
[来自 /etc/rc.d/init.d/functions] 时不可用”。所以我的后续问题是关于获取 PID。
如果你想使用daemon
来自 /etc/rc.d/init.d/functions 的函数,你如何捕获 PID?
您需要创建一个包装器外壳脚本,该脚本将您的程序作为背景并使用捕获 PID $!
,然后将包装器外壳脚本传递给该 daemon
函数。
可能有更优雅的方式来守护程序而不使用daemon
来自 /etc/rc.d/init.d/functions 的函数,但是这个问题/答案是关于使用这个daemon
函数的。[2]
这是原因的低级逐步说明:
我将使用sleep
[1] 作为您希望使用daemon
来自 /etc/rc.d/init.d/functions 的函数来守护进程的任何程序的替身。
您需要创建一个包装器 shell 脚本,该脚本作为背景sleep
并通过$!
. 因此,例如,您sleep_wrapper.sh
将是:
#!/bin/bash
sleep 100 &
PID=$!
echo $PID
然后将此包装器传递给daemon
via:
daemon sleep_wrapper.sh
如果您天真地尝试调用daemon sleep 100
然后PID=$!
您将不会获得进程的PID,sleep
而是:
runuser
runuser
产生bash
过程bash
产生sleep
[1] 大多数二进制应用程序不会自行设置后台,因此sleep
是此示例的一个很好的替代品。显然,为了适应你的情况,你可以用sleep
你想使用的任何程序来替换。
[2] 似乎应该有更好的方法来守护不涉及使用这个特定的守护函数。