我希望在Linux中创建一个应用程序,其中一次只能运行一个应用程序实例。我想让它变得健壮,这样如果应用程序的一个实例崩溃,它将无法无限期地阻止所有其他实例。我真的很感激一些关于如何做到这一点的示例代码(因为在网上有很多关于这个主题的讨论,但是当我尝试它时我找不到任何有用的代码)。
答案 0 :(得分:4)
传统的UNIX方法是使用 PID文件。
在流程开始之前,它会检查是否存在预先确定的文件 - 通常是/var/run/<process_name>.pid
。如果找到,则表示进程已在运行且此进程退出。
如果文件不存在,则这是第一个运行的进程。它创建文件/var/run/<process_name>.pid
并将其PID写入其中。该过程在退出时取消链接文件。
<强>更新强>
处理守护程序崩溃的情况&amp;留在pid文件后,如果找到pid文件,可以在启动期间进行额外的检查:
ps
并确保不存在具有该PID的进程ps
输出/proc/$PID/stat
答案 1 :(得分:3)
您可以使用Linux提供的文件锁定工具。您尚未指定语言,但您可能会以某种形式或其他形式发现此功能。
这是一个简单的想法,如何在C程序中这样做。程序启动时,您可以使用fcntl
系统调用对整个文件进行独占非阻塞锁定。当尝试启动另一个应用程序实例时,尝试锁定文件时会出错,这意味着应用程序已在运行。
这是一个小例子如何使用fcntl
获取完整文件锁(此函数提供了放置字节范围锁的功能,但是当长度为0时,整个文件被锁定)。
struct flock lock_struct;
memset(&lock_struct, 0, sizeof(lock_struct));
lock_struct.l_type = F_WRLCK;
lock_struct.l_whence = SEEK_SET;
lock_struct.l_pid = getpid();
ret = fcntl(fd, F_SETLK, &lock_struct);
请注意,您需要先打开一个文件才能锁定。这意味着您需要有一个文件来用于锁定。将它放在不会对其他应用程序造成任何分心/混淆的地方可能是有用的。
当进程终止时,它所采取的所有锁定都将被释放,因此不会阻止任何锁定。
这只是其中一个想法。我很确定还有其他办法。