3

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

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

4

1 回答 1

2

您需要创建一个包装器外壳脚本,该脚本将您的程序作为背景并使用捕获 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

然后将此包装器传递给daemonvia:

daemon sleep_wrapper.sh

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

  • 你会得到PIDrunuser
  • runuser产生bash过程
  • 终于bash产生sleep

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

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

于 2016-06-29T14:53:12.093 回答