我正在尝试构建一个小shell脚本,该脚本会检测到一个陈旧的文件/var/lib/dpkg/lock
,如果没有正在运行的dpkg进程,它将删除它。如何以编程方式删除陈旧的dpkg锁定文件?
我该怎么做? ...使用最好一个班轮:)
我正在尝试构建一个小shell脚本,该脚本会检测到一个陈旧的文件/var/lib/dpkg/lock
,如果没有正在运行的dpkg进程,它将删除它。如何以编程方式删除陈旧的dpkg锁定文件?
我该怎么做? ...使用最好一个班轮:)
sudo lsof | grep -q /var/lib/dpkg/lock || sudo rm -f /var/lib/dpkg/lock
说明:
1. lsof: list open files
2. | (= pipe to) grep: is /var/lib/dpkg/lock in the list?
3. || (= or) rm: no? rm it!
有几种方式来处理在你描述的方式去除锁定文件。 (但是,更合适的方法是创建锁定文件(或锁定目录以进行原子锁定),其中包含正在运行的进程的PID
)。但是,对于您描述的简单情况,您可以在运行过程的名称上使用pidof
作为另一种类型的检查。
(请注意,如果您有多个进程在同一名称下运行,锁定文件将被删除,并且锁定文件属于哪个进程没有关联)。
您的具体情况利用的pidof
(和受限制)的简短脚本可以是:
#!/bin/bash
test -z "$1" && { ## validate required input/show usage
printf "error: insufficient input, usage: %s procnm [lockfile].\n" \
"${0//*\/}" >&2
exit 1
}
procnm="$1" ## process name
victim=${2:-/var/lib/dpkg/lock} ## lockfile name
if [ ! -n "$(pidof "$procnm")" ] ## test pidof name
then ## if not running, rm lock
[ -f "$victim" ] && rm "$victim"
fi
的脚本需要进程名作为第一个参数,并锁定文件的一个可选的第二个参数位置。 (假定您将预期的lockfile硬编码为默认值)。例如
$ bash rmlock.sh
error: insufficient input, usage: rmlock.sh procnm [lockfile].
你应该从未删除dpkg的锁定文件。它的存在与否不是而不是表示锁是否存在。 dpkg在预先存在的文件上使用区域锁定。如果人们停止提供这些建议,这将是一件好事。
请参阅有关详细信息,此FAQ条目:https://wiki.debian.org/Teams/Dpkg/FAQ#Q:_What_can_be_done_when_the_dpkg_lock_is_held.3F
只是一个猜测,但尝试将其删除。如果某个进程正在使用它,则删除将失败。 – Marichyasana