我正在嘗試構建一個小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