我经常看到程序指定pid和lock文件。我不太确定他们是做什么的。
例如编译nginx时:
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
有人可以解释一下这个吗?
答案1
pid 文件是由某些程序编写的,用于在启动时记录其进程 ID。这有多个目的:
- 这是向系统的其他进程和用户发出的信号,表明该特定程序正在运行,或者至少已成功启动。
- 它允许人们编写一个非常容易的脚本来检查它是否正在运行,并
kill
在想要结束它时发出一个简单的命令。 - 对于程序来说,这是一种查看其先前运行的实例是否未成功退出的廉价方法。
当然,仅存在 pid 文件并不能保证特定进程 id 正在运行,因此这种方法并不是 100% 万无一失,但在很多情况下“足够好”。检查进程表中是否存在特定的 PID 并不完全可以跨类 UNIX 操作系统移植,除非您想依赖该ps
实用程序,这可能不希望在所有实例中调用(并且我相信某些类 UNIX 操作系统无论如何以不同的方式实施ps
)。
锁定文件的想法如下:目的是一个程序的两个(行为良好的)单独实例(可能在一个系统上同时运行)不会同时访问其他内容。这个想法是在程序访问其资源之前,它会检查锁定文件是否存在,如果锁定文件存在,则错误输出或等待它消失。当它不存在时,想要“获取”资源的程序会创建该文件,然后稍后可能遇到的其他实例将等待该过程完成。当然,这假设“获取”锁的程序实际上释放了锁并且没有忘记删除锁文件。
这是可行的,因为所有类 UNIX 操作系统下的文件系统都强制执行序列化,这意味着在任何给定时间实际上只发生对文件系统的一次更改。有点像数据库的锁等等。
操作系统或运行时平台通常提供同步原语,并且使用这些原语通常是更好的决定。可能存在这样的情况,例如编写一些旨在在过去和未来的各种操作系统上运行的东西,而没有可靠的库来抽象调用(例如可能sh
或bash
基于脚本旨在在各种 UNIX 风格中工作) - 在这种情况下这个方案可能是一个很好的折衷方案。
答案2
这些文件通常由只能在系统上运行一次的守护程序使用。 PID 文件通常包含已启动并正在运行的程序的进程 ID 号(如果存在)。此外,当它启动时,它会创建锁定文件。只要锁定文件存在,如果没有用户干预,它就不会启动另一个锁定文件。如果锁定文件存在并且 pid 文件中提到的进程 ID 未运行,则守护进程被视为处于“死亡”状态,这意味着它应该正在运行,但可能不是由于崩溃或不正确关闭而导致的。这可能会为某些程序启动特殊的启动/重新启动场景。正确关闭它会删除锁定文件。
答案3
PID 文件将包含正在运行的进程的进程 ID。这有多种用途;您可以阅读它并检查该进程是否仍在运行并采取适当的操作,或者阅读它并终止该进程。
锁定文件很可能是特定于应用程序的。锁定文件用于指示某些资源正在使用中,并且想要访问的进程应该等到资源被释放后再继续。