Linux 何时删除/proc/?

Linux 何时删除/proc/?,linux,linux-kernel,Linux,Linux Kernel,在运行时,处理打开的上千个文件(&M)。然后发布了killl-9。然后我有一个关于以下两个事件的顺序的问题。 无法访问/proc/。 b进程A打开的所有文件都已关闭 关于这个问题的更多背景: 进程A是一个多线程后台服务。它由cmd./process_A args1 arg2 arg3启动。 还有一个看门狗进程,它每隔1秒检查进程a是否仍处于活动状态。如果进程A已停止,则重新启动它。看门狗检查流程A的方式如下所示。 1在/proc下收集所有数字子目录/ 2将/proc//cmdline与进程A的c

在运行时,处理打开的上千个文件(&M)。然后发布了killl-9。然后我有一个关于以下两个事件的顺序的问题。 无法访问/proc/。 b进程A打开的所有文件都已关闭

关于这个问题的更多背景: 进程A是一个多线程后台服务。它由cmd./process_A args1 arg2 arg3启动。 还有一个看门狗进程,它每隔1秒检查进程a是否仍处于活动状态。如果进程A已停止,则重新启动它。看门狗检查流程A的方式如下所示。 1在/proc下收集所有数字子目录/ 2将/proc//cmdline与进程A的cmdline进行比较。如果这些是与/proc//cmdline匹配的,则进程A处于活动状态,不执行任何操作,否则重新启动进程A

在进行初始化时,进程A将执行以下操作。 1打开文件A 2群牛 3将文件A映射到内存中 4关闭文件A 进程A将在初始化后映射数千个文件。 几分钟后,发出kill-9。 看门狗检测到进程A的死亡,请重新启动它。但有时流程A卡在第2步A。经过一些调试后,我们发现在进程A被终止时会执行fileA的解锁。但有时,此事件会在新流程的步骤2之后发生。 因此,我们猜测通过monitor/proc检查进程活动的方法/ 这是不对的

然后发布kill-9

这是个坏习惯。你最好先发一封信。因为行为良好的进程和设计良好的程序可以捕获它,并在获得SIGTERM时正确地退出。。。。在某些情况下,我甚至建议:发送SIGTERM。等两三秒钟。发送SIGQUIT。等两秒钟。最后,为那些没有正确编写或行为不端的坏程序发送SIGKILL信号。几秒钟后,你可以发送一个SIGKILL。读和读。在多线程但特定于Linux的程序中,您可以使用或在Qt文档中使用self-trick,但不特定于Qt

如果您的Linux系统是基于,您可以想象您的程序-A是用systemd工具启动的。然后您将使用systemd工具与它进行通信。在某些方面,我不知道细节,systemd正在使其几乎过时。请注意,信号不是多线程友好的,在上个世纪,它是为单线程进程设计的

我们猜测通过monitor/proc/检查进程活动的方法是不正确的

检测是否存在您有足够权限的进程(例如,使用uid/gid运行的进程)的通常、更快、原子性足够强的方法是,将第二个参数与信号号一起使用,以终止0。引用该手册页:

   If sig is 0, then no signal is sent, but existence and permission
   checks are still performed; this can be used to check for the
   existence of a process ID or process group ID that the caller is
   permitted to signal.
当然,在与它进行任何进一步的交互之前,其他进程仍然可以终止。因为Linux有抢占式调度

监视进程最好使用killpid-of-process-A,0来检查该进程-A的存在性和活跃性。使用/proc/pid-of-process-A/不是正确的方法

无论您编写什么代码,这个过程都可能异步消失,特别是当它有一些导致分段错误的bug时。当进程终止时,即使存在分段错误,内核也会对其文件锁进行操作并释放它们

然后发布kill-9

这是个坏习惯。你最好先发一封信。因为行为良好的进程和设计良好的程序可以捕获它,并在获得SIGTERM时正确地退出。。。。在某些情况下,我甚至建议:发送SIGTERM。等两三秒钟。发送SIGQUIT。等两秒钟。最后,为那些没有正确编写或行为不端的坏程序发送SIGKILL信号。几秒钟后,你可以发送一个SIGKILL。读和读。在多线程但特定于Linux的程序中,您可以使用或在Qt文档中使用self-trick,但不特定于Qt

如果您的Linux系统是基于,您可以想象您的程序-A是用systemd工具启动的。然后您将使用systemd工具与它进行通信。在某些方面,我不知道细节,systemd正在使其几乎过时。请注意,信号不是多线程友好的,在上个世纪,它是为单线程进程设计的

我们猜测通过monitor/proc/检查进程活动的方法是不正确的

检测是否存在您有足够权限的进程(例如,使用uid/gid运行的进程)的通常、更快、原子性足够强的方法是,将第二个参数与信号号一起使用,以终止0。引用该手册页:

   If sig is 0, then no signal is sent, but existence and permission
   checks are still performed; this can be used to check for the
   existence of a process ID or process group ID that the caller is
   permitted to signal.
当然,在与它进行任何进一步的交互之前,其他进程仍然可以终止。因为Linux有抢占式调度

监视进程最好使用killpid-of-process-A,0来检查该进程-A的存在性和活跃性。使用/proc/pid-of-process-A/不是正确的方法

不管你写什么 t进程-A可能会异步消失,特别是当它有一些导致分段错误的bug时。当进程终止时,即使存在分段错误,内核也会对其文件锁执行操作并释放它们。

不要扫描/proc/PID以确定特定进程是否已终止。有很多更好的方法可以做到这一点,比如让你的看门狗程序实际启动服务器程序并等待它终止

或者,让看门狗监听TCP套接字,让服务器进程连接到该套接字并发送其PID。如果一端死亡,另一端可以注意到连接已关闭的提示:每隔一段时间向冻结的对等方发送一个心跳数据包。如果看门狗在第一台服务器仍在运行时接收到来自另一台服务器的连接,它可以决定允许该连接,或者通过TCP或kill通知其中一个实例关闭。

不要扫描/proc/PID以确定特定进程是否已终止。有很多更好的方法可以做到这一点,比如让你的看门狗程序实际启动服务器程序并等待它终止


或者,让看门狗监听TCP套接字,让服务器进程连接到该套接字并发送其PID。如果一端死亡,另一端可以注意到连接已关闭的提示:每隔一段时间向冻结的对等方发送一个心跳数据包。如果看门狗在第一台服务器仍在运行时从另一台服务器接收到连接,它可以决定允许连接,或者通过TCP或kill通知其中一个实例关闭。

您能告诉我们您提出此问题的原因吗?如果答案是1发生在2之前,你会怎么做?如果情况正好相反,你会怎么做?如果是不确定的,你会怎么做?@JohnZwinck补充了更多的背景知识你的过程实际上在做什么?当它崩溃时会发生什么?你会丢失数据吗?怎样为什么?多少钱?我见过一些报告说/proc的readdir有时会忽略一些条目。这也许能解释你所看到的。如果必须扫描/proc,请在断定进程已退出之前尝试两次。或者,只需检查/proc/pid/stat是否不存在。您能告诉我们您问这个问题的原因吗?如果答案是1发生在2之前,你会怎么做?如果情况正好相反,你会怎么做?如果是不确定的,你会怎么做?@JohnZwinck补充了更多的背景知识你的过程实际上在做什么?当它崩溃时会发生什么?你会丢失数据吗?怎样为什么?多少钱?我见过一些报告说/proc的readdir有时会忽略一些条目。这也许能解释你所看到的。如果必须扫描/proc,请在断定进程已退出之前尝试两次。或者,只需检查/proc/pid/stat.kill-9是否不存在就可以了。kill-9用于测试我们的看门狗程序,但正如我所解释的,这是一个坏习惯。@basilestrynkevitch,但您需要测试系统是否可以从不干净的服务终止中恢复,并确保它可以在正常状态下重新启动。@IanAbbott:我同意,但是,请相信这是该服务的责任,而不是整个系统的责任。+@BasileStarynkevitch如果服务始终表现出负责任的态度,那么就不需要一个看门狗了!kill-9用于测试我们的看门狗程序,但正如我所解释的,这是一个坏习惯。@basilestrynkevitch但您需要测试系统是否可以从服务的不干净终止中恢复,并确保它可以在正常状态下重新启动。@IanAbbott:我同意,但相信这是该服务的责任,不是整个系统。+@BasileStarynkevitch如果服务一直表现得负责,就不需要看门狗了!