pid 和 lock 文件有什么用?

Sta*_*ann 93 lock pidfile

我经常看到程序指定pid和lock文件。而且我不太确定他们做什么。

比如编译nginx的时候:

--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
Run Code Online (Sandbox Code Playgroud)

有人可以对此有所了解吗?

Law*_*ceC 106

pid 文件是由一些程序编写的,用于在启动时记录它们的进程 ID。这有多种用途:

  • 这是向系统的其他进程和用户发出的信号,表明该特定程序正在运行,或者至少已成功启动。
  • 它允许人们编写一个非常容易的脚本来检查它是否正在运行,并kill在想要结束它时发出一个简单的命令。
  • 对于程序来说,这是一种查看它之前运行的实例是否没有成功退出的廉价方法。

当然,仅仅存在 pid 文件并不能保证该特定进程 id 正在运行,因此这种方法不是 100% 万无一失,但在很多情况下“足够好”。检查进程表中是否存在特定 PID 不能在类 UNIX 操作系统中完全移植,除非您想依赖该ps实用程序,这可能不希望在所有实例中调用(我相信某些类 UNIX 操作系统ps无论如何以不同的方式实施)。

锁定文件的想法如下:目的是使程序的两个(行为良好的)独立实例可能在一个系统上同时运行,不要同时访问其他东西。这个想法是在程序访问其资源之前,它会检查锁定文件是否存在,如果锁定文件存在,要么出错,要么等待它消失。当它不存在时,想要“获取”资源的程序会创建该文件,然后其他可能稍后遇到的实例将等待此过程完成。当然,这假设“获取”锁的程序实际上确实释放了它并且不会忘记删除锁文件。

这是有效的,因为所有类 UNIX 操作系统下的文件系统都强制执行序列化,这意味着在任何给定时间实际上只对文件系统进行一次更改。有点像数据库之类的锁。

操作系统或运行时平台通常提供同步原语,而使用这些原语通常是更好的决定。可能存在一些情况,例如编写一些旨在在过去和将来在各种操作系统上运行的东西,而没有可靠的库来抽象调用(例如可能shbash基于脚本的目的是在各种 unix 风格中工作) - 在这种情况下这个方案可能是一个很好的折衷方案。

  • LawrenceC, Re "*当它不存在时,想要“获取”资源的程序会创建文件*"; 但是有适当的功能**专门构建**来进行这种同步。为什么不依靠这些功能而不是使用“文件黑客”? (3认同)
  • 这是正确的,除非手动删除锁定文件。VMWare Player 表现出这种行为,例如,如果 VMWare Player 崩溃,您必须删除 VM 目录中的“.lck”文件,否则当您尝试启动它时,它会告诉您它正在使用中。 (2认同)
  • 我认为 Windows 程序以这种方式工作并不常见。我见过的唯一具有这种行为的程序是来自 Unix/Linux 的端口 (2认同)

Cal*_*leb 18

这些文件通常由在系统上只应运行一次的守护进程使用。PID 文件通常包含已启动和正在运行的程序的进程 ID 号(如果存在)。此外,当它启动时,它会创建锁定文件。只要锁文件存在,它就不会在没有用户干预的情况下启动另一个文件。如果锁定文件存在并且 pid 文件中提到的进程 id 未运行,则认为守护进程处于“死”状态,这意味着它应该正在运行,但可能不是由于崩溃或不正确的关闭造成的. 这可能会为某些程序启动特殊的启动/重新启动方案。正确关闭它将删除锁定文件。

  • @Caleb - 请解释为什么同时使用 PID 文件和锁定文件。看来 PID 文件就足够了。如果 PID 文件存在,则可以检查 PID 以查看进程是否正在运行,只需比检查锁定文件、检查 PID 文件,然后验证进程是否存在所需的步骤少。 (2认同)
  • @MVaughan 如果没有别的办法的话,为了避免竞争条件。有些应用程序有时仍需要 PID,但可以放弃锁定。但在更基本的层面上,如果您为这两项操作都超载了一个文件,则会导致失败,例如崩溃,从而在系统上留下不一致的状态。 (2认同)

小智 8

PID 文件将包含正在运行的进程的进程 ID。这有多种用途;您可以阅读它并检查该进程是否仍在运行并采取适当的措施或阅读它并终止该进程。

锁定文件很可能是特定于应用程序的。锁定文件用于指示某些资源正在使用中,并且想要访问的进程应该等到资源被释放后再继续。