如何检查应用程序/二进制文件的另一个实例是否已运行



我正在使用Objective-c在Mac中编写命令行应用程序

在应用程序

启动时,我想检查同一应用程序的另一个实例是否已在运行。如果是,那么我应该等待它完成或退出当前实例或退出其他实例等。

有什么办法可以做到这一点吗?

为此,标准的Unix解决方案是创建一个"运行文件"。启动时,您尝试创建该文件并将 pid 写入该文件(如果它不存在);如果它确实存在,请从中读取 PID,如果有一个正在运行的程序具有该 PID 和您的进程名称,请等待/退出/其他任何内容。

问题是,你

把那个文件放在哪里,你怎么称呼它?

好吧,首先,您必须确定"已经在运行"的确切含义。显然不是"世界任何地方",但它可以是从"当前计算机上的任何地方"到"当前桌面会话中"的任何内容。(例如,如果用户 A 启动您的程序,暂停它,然后用户 B 出现并通过快速用户切换接管计算机,她是否应该能够运行该程序?

对于这个问题的几乎任何合理的答案,都有一个明显的路径名模式。例如,在 Mac 上,/tmp 是系统范围的共享,而 $TMPDIR 特定于给定会话,因此,例如,/tmp/${ARGV[0]}.pid 是说"机器上只有一个副本,句点"的好方法,而 ${TMPDIR}/${ARGV[0]}.pid 是说"每个会话只有一个副本"的好方法。

执行此操作的简单但常见的方法是检查进程列表中是否有可执行文件的名称。

ps - A | grep <your executable name>

谢谢你@abarnert。

这就是我目前实施的方式。在 main() 的开头,我会检查二进制文件自己的目录中是否存在名为 .lock 的文件(我正在考虑将其移动到/tmp)。如果是,应用程序将退出。

如果没有,它将创建文件。在应用程序结束时,将删除 .lock 文件

我还没有将 pid 写入该文件,但是当需要退出以前的实例时,我会这样做(到目前为止我不需要它,但将来可能会)。我认为可以使用以下方法检索 PID

int myPID=[[NSProcessInfo processInfo] processIdentifier];

该程序将由作为根守护程序运行的自定义调度程序调用。所以它将以根身份运行。

看到答案,我认为没有解决问题的直接方法。

最新更新