2

我有一个二进制文件,它是一个守护进程,它是用 C 语言开发的。我想在我的程序开头添加一个检查,以确保二进制文件只启动一次。我的二进制文件在 Linux 上运行。

有什么建议么?

4

4 回答 4

4

一种常见的方法是将PID 文件放入/var/run. 守护进程成功启动后,flock将其 PID 写入此文件。启动时,检查此文件中的 PID 值(如果存在)。如果当前没有运行 PID,则应用程序可以安全启动。如果 PID 存在,请执行检查以查看该 PID 是否是可执行文件的实例。如果不是,启动也是安全的。您应该在退出时删除该文件,但这不是绝对必要的。

于 2013-06-04T16:21:25.127 回答
2

在我看来,最好的方法是不这样做。让您的初始化方案序列化守护进程的实例: systemdrunitsuperviseupstartlaunchd等可以确保没有双重调用。

如果您需要“手动”调用您的守护程序,请尝试使用 linux 实用程序flock(1)或像setlock这样的第 3 方实用程序。这两个都将在(可能是继承的)锁定文件的保护下运行守护程序,该锁定文件在程序的生命周期内保持锁定状态。

如果您坚持将此功能添加到守护程序本身(在我看来,这是大多数守护程序不需要的复杂性),请选择一个锁定文件并将其保留为独占flock(2) d。与大多数 pidfile/进程表方法不同,这种方法不易竞争。与 POSIX 系统信号量不同,此机制将正确处理崩溃的守护程序的情况(进程崩溃时锁消失)。

也可能有其他简单的序列化。如果你的守护进程绑定到一个套接字,你知道 EADDRINUSE 可能意味着另一个实例正在运行......

于 2013-06-04T16:29:23.310 回答
0

另一种经典方法是拥有一个锁定文件——程序创建一个文件,但前提是该文件不存在。如果该文件确实存在,则假定该程序的另一个副本正在运行。因为程序在创建文件后可能会崩溃,所以更智能的版本可以检测到这种情况。

于 2013-06-04T16:19:37.360 回答
0

分叉并执行:

 pidof nameOfProgram

如果它返回一个值,你就知道你的程序正在运行!

于 2013-06-04T16:15:29.403 回答