我正在尝试构建一个小的shell脚本来检测过时的/var/lib/dpkg/lock
文件,如果没有正在运行的dpkg进程,它将删除它。
我该怎么做? ......最好使用单线:)
答案 0 :(得分:0)
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!
答案 1 :(得分:0)
有几种方法可以按照您描述的方式删除锁定文件。 (但是,更正确的方法是创建锁定文件(或用于原子锁定的lockdir),包含正在运行的进程的PID
。但是,对于您描述的简单情况,您可以在正在运行的进程的名称上使用pidof
作为另一种类型的检查。
(请注意,如果有多个进程在同一名称下运行,则会删除lockfile,并且没有关于lockfile属于哪个进程的相关性。)
使用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位置。 (假设您将预期的锁定文件硬编码为默认值)。 e.g。
$ bash rmlock.sh
error: insufficient input, usage: rmlock.sh procnm [lockfile].
答案 2 :(得分:0)
您应该从不删除dpkg锁定文件。它的存在与否不表示锁是否到位。 dpkg在预先存在的文件上使用区域锁定。如果人们不再提出这个建议,那将是件好事。
请参阅此常见问题解答条目以获取更多信息:https://wiki.debian.org/Teams/Dpkg/FAQ#Q:_What_can_be_done_when_the_dpkg_lock_is_held.3F