pid和锁定文件有什么用?


75

我经常看到程序指定pid和lock文件。我不确定他们的工作。

例如,在编译nginx时:

--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \

有人可以阐明这一点吗?

Answers:


86

pid文件由某些程序编写,以在启动时记录其进程ID。这有多个目的:

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

当然,仅存在pid文件并不能保证该特定进程的ID正在运行,因此,此方法不是100%可靠的,但是在许多情况下“足够好”。除非您要依赖ps实用程序,否则检查进程表中是否存在特定的PID并不是完全可移植到类似UNIX的操作系统上,在所有实例中调用该实用程序可能都不可取(而且我相信某些类似UNIX的操作系统ps无论如何都要实施)。

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

之所以可行,是因为在所有类似UNIX的操作系统下,文件系统都执行序列化,这意味着在任何给定时间实际上仅对文件系统进行一次更改。诸如此类的数据库锁。


1
这是正确的,除非手动删除了锁定文件。VMWare Player表现出这种行为,例如,如果VMWare Player崩溃,则必须删除.lckVM目录中的文件,否则在尝试启动该文件时会告诉您该文件正在使用中。
LawrenceC

1
Windows呢?它如何处理.lock文件?毕竟,它不像Unix。
SarahofGaia 2015年

2
我认为Windows程序以这种方式工作并不常见。我所见过的唯一具有这种行为的程序是Unix / Linux的端口
HaMster

2
LawrenceC,关于“ 当它不存在时,想要“获取”资源的程序将创建文件 ”;但是,有专门构建的适当功能来执行此类同步。为什么不依靠这些功能而不使用“文件入侵”呢?
Pacerier '16

1
@Pacerier-这种方式的锁定文件很可能被诸如外壳程序脚本或可能与外壳程序脚本交互的程序之类的东西使用,因为与其他同步原语相比,Unix / Linux外壳程序非常容易与文件系统交互。文件还可以轻松地在不同的进程中持久保存。一个高性能的程序很可能会使本机OS原语与文件相对,从而在内部进行同步,甚至与非shell进程进行同步。
LawrenceC

14

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


+1说明同时使用锁定文件和pid文件。
凯尔·克鲁

@Caleb-请解释为什么同时使用PID文件和锁定文件。似乎一个PID文件就足够了。如果存在PID文件,则可以检查PID以查看进程是否正在运行,所花的步骤比检查锁定文件,检查PID文件,然后验证进程是否存在的步骤少。
MVaughan

@MVaughan避免种族歧视。有些应用有时会使用仍需要PID但可以放弃锁定的时间。但是从根本上来说,如果您为两个操作都重载了一个文件,则会打开失败之门,例如崩溃,使系统状态不一致。
卡雷布(Caleb),

8

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.