Bash 如何以编程方式删除过时的dpkg锁文件?
我正在尝试构建一个小的shell脚本,它将检测一个过时的Bash 如何以编程方式删除过时的dpkg锁文件?,bash,Bash,我正在尝试构建一个小的shell脚本,它将检测一个过时的/var/lib/dpkg/lock文件,并在没有运行dpkg进程的情况下将其删除 我该怎么做。。。最好使用一个衬里:) 说明: 1. lsof: list open files 2. | (= pipe to) grep: is /var/lib/dpkg/lock in the list? 3. || (= or) rm: no? rm it! 说明: 1. lsof: list open files 2. | (= pipe to)
/var/lib/dpkg/lock
文件,并在没有运行dpkg进程的情况下将其删除
我该怎么做。。。最好使用一个衬里:)
说明:
1. lsof: list open files
2. | (= pipe to) grep: is /var/lib/dpkg/lock in the list?
3. || (= or) rm: no? rm it!
说明:
1. lsof: list open files
2. | (= pipe to) grep: is /var/lib/dpkg/lock in the list?
3. || (= or) rm: no? rm it!
有几种方法可以按照您描述的方式删除锁定文件。(但是,更合适的方法是创建lockfile(或原子锁定的lockdir),其中包含正在运行的进程的
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位置的可选第二个参数。(假定您已将预期的锁定文件硬编码为默认设置)。e、 g
有几种方法可以按照您描述的方式删除锁定文件。(但是,更合适的方法是创建lockfile(或原子锁定的lockdir),其中包含正在运行的进程的
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位置的可选第二个参数。(假定您已将预期的锁定文件硬编码为默认设置)。e、 g
您应该永远不要删除dpkg锁定文件。其存在或不存在表示锁是否到位。dpkg对预先存在的文件使用区域锁定。如果人们不再给出这样的建议,那就好了
有关更多信息,请参阅此常见问题解答条目:您应该永远不要删除dpkg锁定文件。其存在或不存在表示锁是否到位。dpkg对预先存在的文件使用区域锁定。如果人们不再给出这样的建议,那就好了
有关更多信息,请参阅此常见问题解答条目:只是猜测,但请尝试删除它。如果某个进程正在使用它,则删除将失败。只是猜测一下,但请尝试删除它。如果某个进程正在使用它,则删除将失败。