2016-04-15 13 views
1

私は、古い/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を含むロックファイル(またはアトミックロック用のlockdir)を作成することです)。ただし、説明した単純なケースでは、別のタイプのチェックとして実行中のプロセスの名前に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 

スクリプトは、最初の引数としてプロセス名を取り、ロックファイルのオプションの第二引数ロケーション。 (あなたが意図したロックファイルがデフォルトとしてハードコードされていると仮定します)。例えば

$ bash rmlock.sh 
error: insufficient input, usage: rmlock.sh procnm [lockfile]. 
0

あなたは dpkgのロックファイルを削除してはいけません。ロックの有無はではなく、であることを示します。 dpkgは、既存のファイルの領域ロックを使用します。人々がこのアドバイスをしなくてもいいですね。

詳細については、このFAQエントリを参照してください:ただの推測https://wiki.debian.org/Teams/Dpkg/FAQ#Q:_What_can_be_done_when_the_dpkg_lock_is_held.3F

関連する問題