是否有一种简单的方法可以确定某个进程是否正在运行? 我需要知道我的程序的一个实例是否在后台运行,如果不是fork并创建后台进程。
答案 0 :(得分:5)
通常这种做法的无竞赛方式是:
这样做的好处就是简单地存储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软件中看到这种方法,这是它如此多才多艺的一部分。