【问题标题】:How to ensure only one copy of the application is running? [duplicate]如何确保只有一份应用程序正在运行? [复制]
【发布时间】:2023-03-30 00:01:01
【问题描述】:

可能重复:
Preventing multiple process instances on Linux

我有一个多线程应用程序,它可以作为守护进程运行,也可以使用输入参数运行一次。

我想确保如果应用程序作为守护进程运行,则不应允许用户再次运行它。

编辑:在你们都建议去羊群之后,我试了一下并将其放入服务器。我知道有一个奇怪的问题,当服务器被退回时,他们会删除所有文件,包括锁定文件:(。现在怎么样?

【问题讨论】:

  • 在 Linux 上,这是通过 lockfile 完成的。
  • @aix 我刚刚意识到并进行了编辑。无论如何,谢谢。
  • @Cicada 好点,所以就像我在进程启动时在当前目录中写了一个文件,如果文件已经存在,不应该允许应用程序运行?
  • 实际上是单进程多线程,还是多进程协作?答案取决于此。

标签: c linux


【解决方案1】:

最简单的方法是绑定到一个端口(可以是unix域,在“私有”目录中)只有一个进程可以绑定到一个端口,所以如果绑定了端口,进程在跑。如果进程退出,内核会自动关闭文件描述符。它确实花费了您的进程一个(未使用的?)文件描述符。通常,守护进程无论如何都需要一些监听套接字。

【讨论】:

  • +1,这绝对是一个干净的方法,特别是如果守护进程已经需要绑定一个套接字,它可能会这样做。
  • 这绝对是最好的方法(而不是 PID、文件锁、tmp 文件和此处发布的所有其他类型的废话)
【解决方案2】:

您可以尝试使用file locks。启动该过程后,您可以打开文件、锁定文件并检查值(例如文件大小)。如果它不是所需的值,则该过程可以退出。如果需要值,请将文件更改为不需要的值。

【讨论】:

  • 我不能只检查文件是否存在吗?创建文件的进程将在终止时将其删除。这引发了另一个问题,如果发生中断怎么办?如何处理?
  • 是的,只检查文件的存在可能就足够了。您可以使用tmpfile 创建文件。如果您的程序崩溃,该文件会自动删除。
  • 其实想想,我觉得开放还不够。如果两个进程同时调用 open(),内核内部可能会出现竞争条件。不假设比较安全。
  • tmpfile,我以前不知道这个:(,谢谢你我学到了一些东西。
  • 其实我是个白痴。如果您使用 tmpfile 创建文件,您将不知道文件名,因此每次调用 tmpfile 都会创建一个新文件。如果您的进程崩溃,我认为没有解决此问题的方法。 Firefox 和 git 经常运行文件锁定问题。
【解决方案3】:

我通过使用 shell 脚本来启动和停止守护程序来实现类似的事情。

在 exe 调用之前的启动脚本中,查看此 exe 是否仍在运行。如果发现它仍在运行,则不会启动新进程。

【讨论】:

  • 谢谢,这绝对是个好主意。我首先看看我们是否可以在流程本身中实现它,如果不能,这个想法也可以。
  • 这不是一个好主意。它容易出错(搜索正在运行的进程并不可靠,并且可能会给出误报)和竞争倾向(它将允许两个几乎同时启动的守护进程同时运行)。
  • 我同意这不是最可靠的方法。但它适合我的要求,因为只有一个用户有权启动守护进程。
猜你喜欢
  • 2012-05-17
  • 2010-09-27
  • 2010-09-28
  • 2011-07-20
  • 1970-01-01
相关资源
最近更新 更多