0

我一直Proc::Daemon在尝试制作启动/停止守护程序脚本,有些事情可以让我做:

X start
X stop
X status

等等。但是,在源代码中,它看起来Proc::Daemon使用“pid”文件或搜索进程表。我关心这两种方法,首先是“pid”被重用,这可能会给人一种服务在实际关闭时启动的印象,其次是进程表条目很容易伪造,并且检查看起来并不特别健壮。

有没有像我描述的那样制作启动/停止守护程序脚本/程序的可靠方法,或者有人已经制作了?请注意,我没有 root 访问权限,如果这很重要,我也在 Solaris 上。

4

2 回答 2

2

尽管 pid 被重用,但我相信它们会通过(大)固定大小的集合进行循环。例如,在 Solaris 上,这曾经是 30,000(现在可能不同)。因此,在您的 pid 被重用之前,必须启动/完成 30,000 个进程。

Proc::Daemon 使用的方法看起来并不合理,并且是解决此问题的一种相当常见的方法。

于 2012-11-21T13:55:02.680 回答
1

我使用的一种方法是让守护进程获得一个文件的独占(写)锁。

您可以通过尝试自己获取锁来测试是否有人持有锁,并且有多种方法可以获取持有文件锁的进程的 PID - 即 fcntl 和可能在 /proc 中的某些内容。

一些忠告:

  1. 使用本地文件(即不是 NFS)进行锁定。
  2. 确保在守护程序启动之前存在锁定文件。
  3. 永远不要删除锁定文件。

内核将锁与文件的 inode 号相关联,因此您始终希望锁文件始终具有相同的 inode 号。删除并重新创建锁文件将更改与锁关联的 inode。

一个简单的保持活动机制可以实现为 cron 作业 - cron 作业只是尝试每 N 分钟生成一次守护进程,然后在无法获得排他锁时让守护进程安静地退出。

于 2012-11-21T15:06:51.110 回答