如何防止Linux程序多次运行?

Jan*_*ard 14 c c++ unix linux executable

防止Linux程序/守护程序在给定时间执行多次的最佳方法是什么?

And*_*ett 20

最常见的方法是创建一个PID文件:定义文件的位置(内部/ var/run是常见的).成功启动后,您将PID写入此文件.在决定是否启动时,请读取文件并检查以确保引用的进程不存在(或者如果它存在,则它不是守护进程的实例:在Linux上,您可以查看/proc/$PID/exe).关闭时,您可以删除该文件,但这不是必需的.

有一些脚本可以帮助您完成此任务,您可能会发现start-stop-daemon它很有用:它可以使用PID文件,甚至只是全局检查是否存在可执行文件.它专为此任务而设计,旨在帮助人们做到正确.


Del*_*ani 5

如果您有权访问代码(即正在编写):

  • 创建一个临时文件,锁定它,完成后删除,return 1;如果文件存在,或者,
  • 列出进程,return 1;如果进程名称在列表中

如果你没有:

  • 为执行上述操作之一的程序创建一个启动器包装器


Ben*_*oît 5

使用boost进程库创建将由进程创建的内存块.如果它已经存在,则意味着该进程的另一个实例.出口.

您需要的更精确的链接就是这个.

#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/scoped_ptr.hpp>

int main()
{
  using boost::interprocess;
  boost::scoped_ptr<shared_memory_object> createSharedMemoryOrDie;
  try
  {
     createSharedMemoryOrDie.reset( 
       new shared_memory_object(create_only, "shared_memory", read_write));
  } catch(...)
  {
     // executable is already running
     return 1; 
  }

  // do your thing here
}
Run Code Online (Sandbox Code Playgroud)

  • 如果进程在释放 shared_memory_object 之前被 -9 杀死,这会起作用吗? (2认同)