如何以编程方式删除陈旧的dpkg锁定文件?

时间:2016-04-15 10:11:07

标签: bash

我正在尝试构建一个小的shell脚本来检测过时的/var/lib/dpkg/lock文件,如果没有正在运行的dpkg进程,它将删除它。

我该怎么做? ......最好使用单线:)

3 个答案:

答案 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