2011-03-05 127 views

回答

0

这通常使用pidfiles完成:/var/run/[name].pid中的文件只包含由fork()返回的进程ID。

 
if pidfile exists: 
    exit() 
else: 
    create pidfile 
    pid = start_background() 
    pidfile.write(pid) 

On shutdown: remove pidfile 
+0

我没有看到该文件夹​​中的许多pid文件,很多都丢失了。还有其他地方吗? – Blackbinary 2011-03-05 20:16:28

+0

这就是系统pidfiles根据[FHS](http://www.pathname.com/fhs/2.2/fhs-5.13.html)放置的位置。 如果您正在编写用户级程序,可以将pidfile放在用户的主目录(〜/。[name]/[name] .pid)中。 – i80and 2011-03-05 20:26:00

+0

这种方法引入了一个竞争条件,对吧? – Vlad 2011-03-05 20:28:40

5

通常情况下这样做的自由种族的方式是:

  • 打开锁文件/写PID文件(但不截断它)
  • 尝试上采取的排它锁它(使用fcntl或flock)不会被阻塞
  • 如果使用EAGAIN失败,那么其他进程已经在运行。
  • 文件描述符现在应该已经为守护被继承和保持开放其使用寿命

这样做了简单的存储PID的优点是,如果有人重复使用PID,你不会得到一个假阳性。

在文件中存储pid最大的问题是系统启动守护进程使用的低编号的pid可能会被其他守护进程重新引导重用。我看到过这种情况。

0

Linux软件,目前为止大并不关心关于程序的排他性,只有他们使用的资源。 “关怀”通常由实施提供(例如,发行基础设施)。例如,如果你想运行一个程序,但该程序锁定或变成僵尸,你无法杀死它,或者它作为一个不同的用户执行其他功能运行。程序为什么要关心另一个副本是否正在运行?这样做似乎只是一种不必要的限制。

如果它是一个打开套接字(如TCP端口)的进程,如果程序无法打开套接字,程序将失败。如果它需要对文件进行独占访问,如果它无法获取,请将其失败。支持PID文件,但不要强制执行。

你会在GNU软件中看到这种方法,这是使它如此多才多艺的一部分。

相关问题