我一直在使用Proc::Daemon
来尝试制作启动/停止守护程序脚本,这让我可以这样做:
X start
X stop
X status
等。但是,在源代码中,Proc::Daemon
似乎使用“pid”文件或搜索进程表。我关注这两种方法,首先是因为“pid”被重用,这可能给人的印象是服务实际上已经关闭,其次是进程表条目容易伪造,并且检查看起来不像特别健壮。
是否有任何强大的方法来制作像我所描述的启动/停止守护程序脚本/程序,或者有人已经制作了一个?请注意,我没有root访问权限,如果重要的话,我也在Solaris上。
答案 0 :(得分:2)
虽然pids可以重复使用,但我相信它们可以通过(大)固定大小集循环。例如在Solaris上,这曾经是30,000(现在可能不同)。因此,在重复使用pid之前,必须启动/完成30,000个进程。
Proc :: Daemon使用的方法看起来并不合理,是解决这个问题的常用方法。
答案 1 :(得分:1)
我使用的方法是让守护进程获取文件的独占(写)锁。
您可以通过尝试自己获取锁来测试是否有人持有锁,并且有多种方法可以获取持有文件锁的进程的PID - 即fcntl和/ proc中的某些内容。
一些建议:
内核将锁定与文件的inode编号相关联,因此您始终希望锁定文件始终具有相同的inode编号。删除并重新创建锁定文件将更改与锁定关联的inode。
一个简单的保持活动机制可以作为一个cron作业实现--cron作业只是尝试每N分钟生成一个守护进程,然后如果它无法获得独占锁,则让守护进程悄然退出。