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

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

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

有脚本可以帮助你做到这一点,你可能会发现start-stop-daemon是有用的:它可以使用PID文件,甚至可以全局检查可执行文件的存在。 它的设计正是为了这个任务,是为了帮助人们正确的做出的。

使用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 } 

如果你有权访问代码(即正在写它):

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

如果你不这样做:

  • 创建一个启动器包装程序,执行上述之一

我不知道你确切的要求是什么,但我有类似的要求; 在这种情况下,我从一个Shell脚本(它是一个HP-UX机器)启动守护进程,在启动守护进程之前,我检查了是否有一个同名的exec已经在运行。 如果是; 那么不要开始一个新的。

通过这种方式,我也能够控制一个进程的实例的数量。

我认为这个方案应该可以工作(而且还可以防止崩溃):
前提条件:您的应用程序有一个PID文件(通常在/ var / run /中)
1.尝试打开PID文件
2.如果不存在,创建它并将你的PID写入它。 继续执行其余的程序
3.如果存在,请阅读PID
4.如果PID仍在运行并且是程序的一个实例,则退出
5.如果PID不存在或被其他程序使用,请删除PID文件并转到步骤2。
6.程序终止时,删除PID文件。

步骤5中的循环确保如果两个实例同时启动,最后只有一个实例正在运行。

有一个PID文件,并在启动时做一个'kill -0 <pid>' 。 从文件中读取的值在哪里? 如果响应是!= 0,那么守护进程不活动,您可能会重新启动它

另一种方法是绑定到端口,并在第二次启动守护进程时处理绑定异常。 如果端口正在使用,则退出,否则继续运行守护进程。

我相信我的解决方案是最简单的:

(如果赛车状况是可能的情况,不要使用它,但在其他情况下,这是一个简单而令人满意的解决方案)

 #include <sys/types.h> #include <unistd.h> #include <sstream> void main() { // get this process pid pid_t pid = getpid(); // compose a bash command that: // check if another process with the same name as yours // but with different pid is running std::stringstream command; command << "ps -eo pid,comm | grep <process name> | grep -v " << pid; int isRuning = system(command.str().c_str()); if (isRuning == 0) { cout << "Another process already running. exiting." << endl; return 1; } return 0; }