我在(VMWare)VM上使用Red Hat Linux(RHEL5)。 我已经写了一个守护进程,它应该一直保持运行,并在启动时自动运行。
昨晚,VM主机有一个不可恢复的硬件问题,虚拟机突然中止。 当它回来时,我的守护进程没有启动,因为pidfile仍然存在。
显然这被称为陈旧pidfile综合症,但我不知道什么是减轻它最好的长期方法。 我在考虑/etc/rc.d*中的启动脚本应该在启动守护进程之前删除pidfile,但是/etc/init.d的服务pipe理脚本应该保持不变,所以像service mydaemon start这样的东西不会打开pid文件。
/etc/rc.d/rc6.d只是在/etc/init.d/的脚本的符号链接,所以我应该如何改变它只在启动时的行为? 我可以在rc.d dirs中创build一个更高优先级的脚本,但是看起来好像很难。 有人还build议添加逻辑,如“如果正常运行时间less于1分钟,删除pidfile”,但也似乎hacky。
任何想法或解决scheme或最佳做法?
使用守护 进程并查看进程pipe理 。
感谢您的提示@Dennis和@coredump。
我发现了一些额外的信息,帮助我解开这个谜团。
我想知道为什么其他守护进程恢复正常。 原来在/etc/rc.d/rc.sysinit有代码清除启动时/var/run和/var/lock中的所有pidfiles。
我configuration了我的守护进程将其pidfile放在其他地方,因为SELinux阻止我“使用可能错误标记的文件”。
所以我还没有解决,因为SELinux的问题,但我认为的答案是“把你的pidfile放在/var/run或/var/lock ,它将在下一次工作”
脚本是一样的,启动过程只是在sysvinit脚本上执行'start'操作。
你为什么不检查pid文件上的pid是否正确,如果不删除它,并用正确的pid创build一个新的pid?
编辑 :你可以grep ps与pidfile来看看过程是否仍然存在。 或者换一种方式。 检查RedHat initscripts,我相信他们有一些帮助function来做到这一点,如pidofproc 。