私は、古い/var/lib/dpkg/lock
ファイルを検出する小さなシェルスクリプトを作成しようとしています。実行中のdpkgプロセスがない場合は、このファイルを削除します。どのようにしてプログラムでdpkgロックファイルを削除できますか?
どうすればいいですか? ...好ましくはワンライナーを使用して:)
私は、古い/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
を含むロックファイル(またはアトミックロック用の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].
あなたは dpkgのロックファイルを削除してはいけません。ロックの有無はではなく、であることを示します。 dpkgは、既存のファイルの領域ロックを使用します。人々がこのアドバイスをしなくてもいいですね。
詳細については、このFAQエントリを参照してください:ただの推測https://wiki.debian.org/Teams/Dpkg/FAQ#Q:_What_can_be_done_when_the_dpkg_lock_is_held.3F
、それを削除してみてください。それがあるプロセスによって使用されている場合、削除は失敗します。 – Marichyasana