我有一个二进制文件,它是一个守护进程,它是用 C 语言开发的。我想在我的程序开头添加一个检查,以确保二进制文件只启动一次。我的二进制文件在 Linux 上运行。
有什么建议么?
在我看来,最好的方法是不这样做。让您的初始化方案序列化守护进程的实例: systemd、runit、supervise、upstart、launchd等可以确保没有双重调用。
如果您需要“手动”调用您的守护程序,请尝试使用 linux 实用程序flock(1)或像setlock这样的第 3 方实用程序。这两个都将在(可能是继承的)锁定文件的保护下运行守护程序,该锁定文件在程序的生命周期内保持锁定状态。
如果您坚持将此功能添加到守护程序本身(在我看来,这是大多数守护程序不需要的复杂性),请选择一个锁定文件并将其保留为独占flock(2) d。与大多数 pidfile/进程表方法不同,这种方法不易竞争。与 POSIX 系统信号量不同,此机制将正确处理崩溃的守护程序的情况(进程崩溃时锁消失)。
也可能有其他简单的序列化。如果你的守护进程绑定到一个套接字,你知道 EADDRINUSE 可能意味着另一个实例正在运行......
另一种经典方法是拥有一个锁定文件——程序创建一个文件,但前提是该文件不存在。如果该文件确实存在,则假定该程序的另一个副本正在运行。因为程序在创建文件后可能会崩溃,所以更智能的版本可以检测到这种情况。
分叉并执行:
pidof nameOfProgram
如果它返回一个值,你就知道你的程序正在运行!