我特别想知道当仅安装一个软件包并运行其 postinst 时它是否保持锁定状态。
答案1
dpkg
在包管理进程启动时设置文件锁/var/lib/dpkg/lock
,并且仅在包管理进程结束时删除该锁。
请查看Debian 维基上dpkg
和dpkg
联机帮助页有关dpkg
其本身的更多信息。我还将添加一个链接dpkg.org其中有关于 API 和文件处理的更具体文档dpkg
。
还有这个相关的堆栈交换帖子讨论如何/var/lib/dpkg/lock
运作。
正如本文中所解释的dpkg
,当前端或其dpkg
本身使用 时,会调用系统调用fcntl
来放置咨询锁。dpkg
需要能够放置此锁并返回false
,如果此锁已就位,则无法继续。一旦 的功能dpkg
完成,它就会释放对/var/lib/dpkg/lock
释放另一个进程的保留,以便能够使用dpkg
。
重要的是,当您收到有锁定的警告时,/var/lib/dpkg/lock
您不需要删除该文件,而是确定当前是否已经有一个用户或进程(例如由 启动的unattended-upgrades
)正在运行包管理进程。此进程可能会挂起,因此您必须终止它并从潜在的数据库损坏中恢复。这将通过遵循本中的建议来完成相关帖子。我再次提醒您,删除文件并不是解除锁定的最佳方法。dpkg
如果问题仍然存在,您需要结束恶意进程并可能进行修复。
要回答您的具体问题:
...如果仅安装一个软件包并运行其 postinst 时它保持锁定状态。
dpkg
仅应在完成包管理过程时锁定。 postinst 脚本可能属于包管理流程,但是如果它要发布/var/lib/dpkg/lock
或其变体,那么这就是应该向包维护者提出的问题。