什么是 .pid 文件,它包含了什么内容?

241

最近我遇到了一个扩展名为.pid的文件,但是打开后内容很少。文档中提到:

Pid文件是一个文件,其中包含了进程标识号(pid),存储在文件系统的一个确定位置中,因此其他程序可以查找运行脚本的pid。

有没有人可以解释更多关于pid文件的内容或者指导我查找pid文件的详细信息?

4个回答

257

pid文件包含了一个程序的进程ID(一个数字)。例如,Apache HTTPD 可以将其主进程号写入pid文件中(这是一个普通的文本文件,仅此而已),然后再使用其中所包含的信息来停止自身。您还可以使用该信息来手动杀死该进程,使用 cat filename.pid | xargs kill


11
为什么不直接用进程名查找进程的过程呢?当你可以运行“pidof $process_name”命令并获得ID时,为什么还要保持.pid文件呢? - Shnatsel
29
@Shnatsel: 因为可能有两个同名进程正在运行,你需要知道哪一个负责那个 PID 文件。还有其他原因,更多细节请参见这里:http://unix.stackexchange.com/questions/12815/what-are-pid-and-lock-files-for - user4815162342
4
如果这样的话,就会有两个PID文件,你将面临与PID查找相同的问题。因此,在这种情况下,PID文件没有任何帮助,只会使情况更加复杂,无论是在这种情况还是我能想到的任何其他情况下都是如此。我怀疑它们可能是出现在procfs之前,或者它们被用作可移植性工具,因为例如Solaris上的procfs界面与Linux上的界面非常不同。 - Shnatsel
4
使用echocat相比于仅使用cat filename.pid | xargs kill,是否有优势? - Simon A. Eugster
3
@Simon 你甚至不需要使用cat。只需使用xargs -a filename.pid kill即可。即使它没有该选项,使用输入重定向运算符仍然比cat更好。 - Tim Seguine
显示剩余5条评论

1

我不确定这是否是唯一的原因,但以下是我的解决方案:

根据您编写杀死所需进程的shell脚本的方式,您可能会在它杀死目标之前杀死kill PID,让我们以mydaemon为例:

kill -9 `ps ax | grep mydaemon | awk '{ print $1 }'`

A) SIGPIPE-ing kill 在32位Linux中,PID通常是15位整数,溢出经常发生,grep或awk的PID出现在mydaemon之前的几率相当大。在64位PID中,数字通常是22位,发生的可能性要小100倍以上,但仍然相当可行。

通过杀死您的任一管道,您将收到SIGPIPE信号,通常这意味着失败,因此在杀死mydaemon之前会杀死kill,使得杀死尝试失败。

B) 杀死其他PID 另外,假设您同时运行vi /etc/mydaemon/mydaemon.conf,那么该PID也可能被杀死,更不用说其他用户的进程了,因为您很可能会以root身份发出这样的命令。

C) 这是一个简单的类Unix锁 -> 不需要额外的代码/守护程序。 PidFiles提供了一种相当简单的方法来创建用户可管理的锁,以防止意外重复生成守护程序。


0

Pidfile 包含进程的 pid。这是一种约定,允许长时间运行的进程更加自我感知。服务器进程可以检查它以停止自身,或者具有启发式,表明其其他实例已经在运行。Pidfiles 也可以用于方便地手动杀死风险,例如 pkill -F <some.pid>


-3

要了解pid文件,请参考DOC

有时候,某些应用程序需要额外的插件和工具支持。因此,它使用这个pid文件来跟踪这些插件和工具进程的运行ID以供参考。

这就是为什么每当您重新启动一个应用程序时,所有必要的插件和依赖应用程序都必须重新启动,因为pid文件将变得过时。


8
您的第一个链接并没有真正回答问题。 - Engineer2021
5
虽然相关资料理论上可能回答了问题,但最好在此处包含答案的基本部分,并提供链接供参考。 - Toby Speight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接