
作成されたバックアップストアの1つで、バックアッププログラム「restic」の「検査」機能を実行しようとしています。私が何をしても、致命的な「ロック」問題が原因でクラッシュします。関連するコマンドラインI/Oは次のとおりです。
tomc@ANB:~/programs/restic-backup$ ./restic check -r
/media/tomc/usbhd4-p2/_restic-bkup/dropbox using temporary cache in /tmp/restic-check-cache-405001323
enter password for repository:
repository fd5c0b03 opened successfully, password is correct
created new cache in /tmp/restic-check-cache-405001323
create exclusive lock for repository
Fatal: unable to create lock in backend: repository is already locked by PID 30546 on ANB by tomc (UID 1000, GID 1000)
lock was created at 2019-10-07 14:49:41 (509h0m19.239359465s ago) storage ID 0fe63838
この問題を解決するにはどうすればよいですか?
答え1
repository is already locked by PID 30546 on ANB by tomc
ps -fp 30546
まず、リポジトリをロックしたプロセスがまだ存在することを確認する必要があります。エラーメッセージによれば、ロックはすでに509hであるため、プロセスが中断される可能性があります。あるいは、プロセスが存在しないか、まったく関連がないように見える場合は、古いロックファイルである可能性があります。
PID 30546を持つプロセスが関連性があると思われる場合は、それを使用してどのファイルがlsof -p 30546
開いているかを確認できます。幸い、ファイルの1つは、プロセスの状態に関する追加情報を提供できるログファイルです。中断が安全に見える場合は、kill 30546
比較的スムーズに中断して、シャットダウン時にロックファイルをクリーンアップする機会を提供できます。
プロセスがコマンドを使用してシャットダウンを拒否した場合は、コマンドを使用してプロセスを強制的に停止できますが、kill 30546
このkill -9 30546
場合、ロックを解除するには追加の手順を実行する必要があります。
~によるとGitHubページの問題#1450restic
、停止したプロセスを終了した後、このコマンドを使用して古いロックを消去できます。
./restic unlock -r /media/tomc/usbhd4-p2/_restic-bkup/dropbox
停止したプロセスが一部のバックアップ操作を実行している場合は、次のコマンドを実行する必要があります。
./restic check -r /media/tomc/usbhd4-p2/_restic-bkup/dropbox
# if the check returns "not referenced in any index" errors, then do this:
./restic rebuild-index -r /media/tomc/usbhd4-p2/_restic-bkup/dropbox
./restic check -r /media/tomc/usbhd4-p2/_restic-bkup/dropbox
# if there is still "not referenced in any index" errors, remove incomplete packs:
./restic prune -r /media/tomc/usbhd4-p2/_restic-bkup/dropbox
./restic check -r /media/tomc/usbhd4-p2/_restic-bkup/dropbox
その後、検査は正常に通過する必要があります。
答え2
この答えはLinuxに固有のものですが、概念はすべてのPOSIXシステムに適用されます。
まず、実際にどのプロセスが実行されているかを確認してください。維持するロック、通常これはプロセスです。いいえロックでブロックされました。ファイルを開いたままにするプロセスが一覧表示されます。
lsof /path/to/lockfile
その後、ファイル記述子を取得してロックを解除します。
# ls -l /proc/<pid>/fd
[... make a note of the file descriptor you care about and substitute <fd> below]
# gdb -p <pid>
gdb> call flock(<fd>, 8)
上8
からLOCK_UN
file.h
それでも機能しない場合は、flock
ファイル記述子を閉じてみることもできますが、作成方法によっては副作用があり、プログラムが中断されることがあります。
gdb> call close(<fd>)
完了したら、gdb
プログラムを続行しますdetach
。
gdb> detach