上下文:
想要在特殊备份过程中对蚀刻/apt钩子活动设置一个锁。
目的是保持整个包的完整性,例如,等待任何包安装完成,然后防止新安装开始直到特殊备份完成。
找到cron下面的shell脚本,该脚本似乎试图锁定
/var/cache/etckeeper/packagelist.pre-install但实际上,它并不是原子化的,因此它是有缺陷的。我认为cron shell脚本是Ubuntu16.04安装的一部分,而不是版本的一部分。Flawed锁代码如下所示。
搜索有关使用/var/cache/etckeeper/packagelist.pre-install作为锁文件的etckeeper文档。没有发现任何文件。但是确实找到了一个脚本文件,它可以写入/var/cache/etckeeper/packagelist.pre-install,而不把它当作锁文件。此时,我假定/var/cache/etckeeper/packagelist.pre-install并不打算用作etckeeper的锁文件接口。Etckeeper内部脚本不处理 /var/cache/etckeeper/packagelist.pre-install as,如下所示。
Question 1:是否有(如果是的话)关于and锁定机制的文档,或者开发人员门户来发出澄清的请求?
在stackexchange站点上有许多关于使用
/var/lib/apt/lists/lock (we call it apt lock below)和
/var/lib/dpkg/lock (we call it dpkg lock below)分别作为apt和dpkg的锁。所有的通信都涉及卡住锁,如何诊断它们,以及如何解除它们。但是,我发现没有引用官方的apt和dpkg文档来指定那些作为正式接口使用的锁文件。
Question 2:是否有关于 apt lock机制和/或 dpkg lock机制的文档?
有缺陷的锁尝试shell脚本,可能由Ubuntu 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
fiEtckeeper内部外壳编写到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发布于 2018-05-12 06:44:23
/var/cache/etckeeper/packagelist.pre-install视为正在处理安装的证据,因此它不应该将任何东西存档。该文件不应该是锁文件,但是cron作业正在使用它作为替代文件。不过,我不会特别担心etckeeper和它有或没有的任何锁文件。如果您想要对etckeeper托管树进行一致的备份,请使用VCS的特性(但不要忘记任何被忽略的文件)。dpkg锁被记录为frontend.txt (/usr/share/doc/dpkg-dev/frontend.txt in dpkg-dev)中的公共接口(尽管很简短)。https://unix.stackexchange.com/questions/443336
复制相似问题