语境:
想加把锁etckeeper/apt特殊备份期间的钩子活动。
目的是保持整个包的完整性,例如,等待任何包安装完成,然后在特殊备份完成之前阻止新安装开始。
在下面找到shell脚本计划任务这似乎是试图锁定
/var/cache/etckeeper/packagelist.pre-install
但实际上它不是以原子方式执行的,因此它是有缺陷的。我认为计划任务shell脚本是的一部分乌班图16.04安装,不是一部分等等管理员发布。 有缺陷的锁码如下所示。
搜索等等管理员有关使用/var/cache/etckeeper/packagelist.pre-install
锁定文件的文档。没有找到文档。但确实找到了一个脚本文件,它可以写入/var/cache/etckeeper/packagelist.pre-install
而不将其视为锁定文件。目前我假设它/var/cache/etckeeper/packagelist.pre-install
不打算用作锁定文件接口等等管理员。 Etckeeper 内部脚本不被
/var/cache/etckeeper/packagelist.pre-install
视为锁定文件,如下所示。
问题 1:是否有(如果有的话在哪里)有关 etckeeper 锁定机制的文档,或者是否有开发人员门户来发出澄清请求?
有很多问题和很多讨论堆栈交换关于使用的网站
/var/lib/apt/lists/lock (we call it apt lock below)
和
/var/lib/dpkg/lock (we call it dpkg lock below)
作为锁易于和包装袋分别。所有的通信都与卡住的锁、如何诊断它们以及如何解锁它们有关。但是,我发现没有任何官方参考易于和包装袋指定这些锁定文件用作正式接口的文档。
问题 2:是否有(如果有的话在哪里)有关的文档易于锁定机构和/或包装袋锁机制作为公共接口?
有缺陷的锁定尝试 shell 脚本,可能由乌班图16.04:
$ sudo cat /etc/cron.daily/etckeeper
#!/bin/sh
set -e
if [ -x /usr/bin/etckeeper ] && [ -e /etc/etckeeper/etckeeper.conf ]; then
. /etc/etckeeper/etckeeper.conf
if [ "$AVOID_DAILY_AUTOCOMMITS" != "1" ]; then
# avoid autocommit if an install run is in progress
lockfile=/var/cache/etckeeper/packagelist.pre-install
if [ -e "$lockfile" ] && [ -n "$(find "$lockfile" -mtime +1)" ]; then
rm -f "$lockfile" # stale
fi
if [ ! -e "$lockfile" ]; then
AVOID_SPECIAL_FILE_WARNING=1
export AVOID_SPECIAL_FILE_WARNING
if etckeeper unclean; then
etckeeper commit "daily autocommit" >/dev/null
fi
fi
fi
fi
等管理员内部 shell scipt 写入packagelist.pre-install
而不将其视为锁 - 因此我不认为它旨在作为锁接口。
$ sudo cat /etc/etckeeper/pre-install.d/10packagelist
#!/bin/sh
# This list will be later used when committing.
mkdir -p /var/cache/etckeeper/
etckeeper list-installed > /var/cache/etckeeper/packagelist.pre-install
etckeeper list-installed fmt > /var/cache/etckeeper/packagelist.fmt
答案1
cron 作业被
/var/cache/etckeeper/packagelist.pre-install
视为正在处理安装的证据,因此它还不应该存档任何内容。该文件不应是锁定文件,但 cron 作业正在使用它作为替代文件。不过,我不会特别担心
etckeeper
它有或没有的任何锁定文件。如果您想要托管树的一致备份etckeeper
,请使用 VCS 的功能(但不要忘记任何被忽略的文件)。这些
dpkg
锁被记录为公共接口(尽管很简短)frontend.txt
(/usr/share/doc/dpkg-dev/frontend.txt
在dpkg-dev
)。