如何避免两次运行程序

时间:2014-08-12 14:50:59

标签: c linux

我想知道是否有办法阻止用户多次启动该程序以避免一些问题。

启动我的程序时
  

/etc/init.d/myprog start

下次当用户执行相同的命令时,它将无法运行。

3 个答案:

答案 0 :(得分:1)

最好的方法是启动器尝试启动,将启动的pid捕获到/ var / run

然后在后续启动时,您将读取pid文件,并执行进程列表(ps)以查看具有该pid的进程是否正在运行。如果是这样,后续启动将报告该进程已在运行且不执行任何操作。

Read up on pid and lock files了解init.d系统下的标准内容。

答案 1 :(得分:1)

您需要open .lock文件并将其锁定为flock

int fd = open("path/to/file.lock", O_RDWR);
if (fd == -1) { 
  /* error opening file, abort */ 
}
if (flock(fd, LOCK_EX | LOCK_NB) == -1) { 
  /* other process already open, abort */ 
}

答案 2 :(得分:1)

Linux Standard Base支持提供此功能的start_daemon功能。从初始化脚本中使用它。

  

start_daemon,killproc和pidofproc函数应使用此算法来确定指定程序的状态和pid。他们应该读取指定的pidfile或其他/var/run/basename.pid,并在确定程序是否正在运行时使用此处的pid。用于确定状态的方法是实现定义的,但应该允许非二进制程序。 1兼容的实现可以使用除基于pidfiles的机制之外的其他机制,除非使用了-p pidfile选项。兼容的应用程序不应该依赖这样的机制,应该始终使用pid文件。当程序停止时,它应该删除它的pid文件。多个pid应由pidfile中的单个空格和pidofproc的输出分隔。

     

这将指定的程序作为守护程序运行。 start_daemon将使用上面给出的算法检查程序是否已在运行。如果是这样,除非给出-f选项,否则它不应启动该守护进程的另一个副本。 -n选项指定一个很好的级别。看得很好(1)。 start_daemon应该返回LSB定义的退出状态代码。如果程序已成功启动或正在运行,它将返回0,否则返回0。