启动停止守护程序

时间:2012-11-21 13:50:01

标签: perl unix

我一直在使用Proc::Daemon来尝试制作启动/停止守护程序脚本,这让我可以这样做:

X start
X stop
X status

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

是否有任何强大的方法来制作像我所描述的启动/停止守护程序脚本/程序,或者有人已经制作了一个?请注意,我没有root访问权限,如果重要的话,我也在Solaris上。

2 个答案:

答案 0 :(得分:2)

虽然pids可以重复使用,但我相信它们可以通过(大)固定大小集循环。例如在Solaris上,这曾经是30,000(现在可能不同)。因此,在重复使用pid之前,必须启动/完成30,000个进程。

Proc :: Daemon使用的方法看起来并不合理,是解决这个问题的常用方法。

答案 1 :(得分:1)

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

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

一些建议:

  1. 使用本地文件(即非NFS)进行锁定。
  2. 确保在守护程序启动之前存在锁文件。
  3. 永远不要删除锁定文件。
  4. 内核将锁定与文件的inode编号相关联,因此您始终希望锁定文件始终具有相同的inode编号。删除并重新创建锁定文件将更改与锁定关联的inode。

    一个简单的保持活动机制可以作为一个cron作业实现--cron作业只是尝试每N分钟生成一个守护进程,然后如果它无法获得独占锁,则让守护进程悄然退出。