C 确定进程是否正在运行?
有没有一种简单的方法来确定某个进程是否正在运行?C 确定进程是否正在运行?,c,linux,operating-system,process,C,Linux,Operating System,Process,有没有一种简单的方法来确定某个进程是否正在运行? 我需要知道我的程序的一个实例是否在后台运行,如果不是,请fork并创建后台进程。这通常是使用pidfiles完成的:一个位于/var/run/[name].pid中的文件,其中只包含fork()返回的进程ID 如果pidfile存在: 退出() 其他: 创建PID文件 pid=开始\背景() 写入(pid) 关闭时:删除文件 这通常是使用pidfiles完成的:一个位于/var/run/[name].pid中的文件,它只包含fork()返回的进程
我需要知道我的程序的一个实例是否在后台运行,如果不是,请fork并创建后台进程。这通常是使用pidfiles完成的:一个位于/var/run/[name].pid中的文件,其中只包含fork()返回的进程ID 如果pidfile存在: 退出() 其他: 创建PID文件 pid=开始\背景() 写入(pid) 关闭时:删除文件
这通常是使用pidfiles完成的:一个位于/var/run/[name].pid中的文件,它只包含fork()返回的进程ID 如果pidfile存在: 退出() 其他: 创建PID文件 pid=开始\背景() 写入(pid) 关闭时:删除文件
通常情况下,无种族歧视的做法是:
- 打开锁文件/pid文件进行写入(但不要截断)
- 尝试在不阻塞的情况下对其进行独占锁定(使用fcntl或flock)
- 如果EAGAIN失败,那么另一个进程已经在运行
- 文件描述符现在应该由守护进程继承,并在其生存期内保持打开状态
将pid存储在文件中的最大问题是,系统启动守护程序使用的编号较低的pid可能会在后续重新启动时被其他守护程序重用。我看到过这种情况。通常情况下,无种族歧视的做法是:
- 打开锁文件/pid文件进行写入(但不要截断)
- 尝试在不阻塞的情况下对其进行独占锁定(使用fcntl或flock)
- 如果EAGAIN失败,那么另一个进程已经在运行
- 文件描述符现在应该由守护进程继承,并在其生存期内保持打开状态
将pid存储在文件中的最大问题是,系统启动守护程序使用的编号较低的pid可能会在后续重新启动时被其他守护程序重用。我已经看到了这种情况。到目前为止,Linux软件基本上不关心程序的排他性,只关心它们使用的资源。“关怀”通常由实施提供(例如发行版的基础设施) 例如,如果您想运行一个程序,但该程序被锁定或变成僵尸,而您没有办法杀死它,或者它正在以另一个用户的身份运行,执行某些其他功能。为什么程序应该关心自身的另一个副本是否正在运行?让它这样做似乎只是一种不必要的限制 如果是一个进程打开了一个套接字(比如TCP端口),那么如果程序无法打开套接字,就让程序失败。如果它需要以独占方式访问某个文件,如果无法获取,则让它失败。支持PID文件,但不要强制使用
你会在GNU软件中看到这种方法,这是它如此多功能的一部分。Linux软件基本上不关心程序的排他性,只关心它们使用的资源。“关怀”通常由实施提供(例如发行版的基础设施) 例如,如果您想运行一个程序,但该程序被锁定或变成僵尸,而您没有办法杀死它,或者它正在以另一个用户的身份运行,执行某些其他功能。为什么程序应该关心自身的另一个副本是否正在运行?让它这样做似乎只是一种不必要的限制 如果是一个进程打开了一个套接字(比如TCP端口),那么如果程序无法打开套接字,就让程序失败。如果它需要以独占方式访问某个文件,如果无法获取,则让它失败。支持PID文件,但不要强制使用
您将在GNU软件中看到这种方法,这是它如此多功能的一部分。我在该文件夹中没有看到很多pid文件,缺少了很多。还有其他地方吗?根据规则,系统文件应该放在那里。如果您正在编写一个用户级程序,您可以将pid文件放在用户的主目录中(~/[name]/[name].pid)。很有可能——标准C I/O中很少有定义为原子的,因此这是很难避免的。在生成后台进程之前创建pidfile并保护清理,我认为风险应该可以忽略不计。请注意,
如果pidfile存在
也会触发旧的陈旧pid文件。您可能还希望检查pid文件的内容,至少验证进程是否处于活动状态,还可能检查进程的名称。我在该文件夹中没有看到太多pid文件,缺少太多。还有其他地方吗?根据规则,系统文件应该放在那里。如果您正在编写一个用户级程序,您可以将pid文件放在用户的主目录中(~/[name]/[name].pid)。很有可能——标准C I/O中很少有定义为原子的,因此这是很难避免的。在生成后台进程之前创建pidfile并保护清理,我认为风险应该可以忽略不计。请注意,如果pidfile存在
也会触发旧的陈旧pid文件。您可能还希望检查pid文件的内容,并至少验证进程是否处于活动状态,还可能检查进程的名称。
if pidfile exists:
exit()
else:
create pidfile
pid = start_background()
pidfile.write(pid)
On shutdown: remove pidfile