确定进程是否正在运行?

时间:2011-03-05 20:04:49

标签: c linux operating-system process

是否有一种简单的方法可以确定某个进程是否正在运行? 我需要知道我的程序的一个实例是否在后台运行,如果不是fork并创建后台进程。

3 个答案:

答案 0 :(得分:5)

通常这种做法的无竞赛方式是:

  • 打开一个锁定文件/ pid文件进行写入(但不要截断)
  • 尝试对其进行独占锁定(使用fcntl或flock)而不阻止
  • 如果EAGAIN失败,则其他进程已在运行。
  • 文件描述符现在应由守护程序继承,并在其生命周期内保持打开状态

这样做的好处就是简单地存储PID,如果有人重用PID,你就不会得到误报。

将pid存储在文件中的最大问题是系统启动守护程序使用的低编号pid可以在后续重新引导时由不同的守护程序重用。我已经看到了这种情况。

答案 1 :(得分: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

答案 2 :(得分:0)

Linux软件,迄今为止并不关心关于程序的排他性,只关注它们使用的资源。 "关怀"通常由实施提供(E.G.发行版的基础设施)。

例如,如果你想运行一个程序,但该程序会锁定或变成僵尸而你无法杀死它,或者它作为执行某些其他功能的其他用户运行。为什么程序要关心自己的另一个副本是否在运行?这样做似乎只是一种不必要的限制。

如果它是打开套接字(如TCP端口)的进程,如果程序无法打开套接字,则程序会失败。如果它需要对文件的独占访问权限,那么如果它无法获取它就会失败。支持PID文件,但不要强制使用。

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