2016-04-15 87 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].