2016-04-15 86 views
1

我正在尝试构建一个小shell脚本,该脚本会检测到一个陈旧的文件/var/lib/dpkg/lock,如果没有正在运行的dpkg进程,它将删除它。如何以编程方式删除陈旧的dpkg锁定文件?

我该怎么做? ...使用最好一个班轮:)

+0

只是一个猜测,但尝试将其删除。如果某个进程正在使用它,则删除将失败。 – Marichyasana

回答

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! 
0

有几种方式来处理在你描述的方式去除锁定文件。 (但是,更合适的方法是创建锁定文件(或锁定目录以进行原子锁定),其中包含正在运行的进程的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].