## はじめに
Linuxサーバーを運用していると、「ファイルが使用中で削除できない」「dpkgがロックされていてパッケージをインストールできない」といったロック関連のトラブルに遭遇することがあります。Linuxにおけるファイルロックは、複数のプロセスが同時に同じファイルへ書き込みを行うのを防ぐ重要な仕組みです。
ロックには大きく分けて、`flock`によるアドバイザリロック、`fcntl`によるレコードロック、そしてdpkgやyumなどが使用するロックファイル方式があります。原因のプロセスを特定せずにロックファイルを強制削除すると、データ破損につながる恐れがあるため、正しい手順での対処が不可欠です。
本記事では、ロックの調査から安全な解除までの実用的なテクニックを解説します。
## 症状・背景
– `apt`実行時に`Could not get lock /var/lib/dpkg/lock-frontend`と表示される
– ファイル削除時に`Device or resource busy`エラーが発生する
– バックアップ処理中にスクリプトがハングし、二重起動を防ぎたい
– アンマウントしようとした際にディスクがbusy状態で外せない
## 手順・設定方法
### ステップ1: ロックしているプロセスを特定する
まずはlsofコマンドで対象ファイルを開いているプロセスを調べます。
“`bash
# 特定ファイルを開いているプロセスを表示
sudo lsof /var/lib/dpkg/lock-frontend
# fuserでも同様の調査が可能(-vで詳細表示)
sudo fuser -v /var/lib/dpkg/lock-frontend
# ディレクトリ配下を再帰的にスキャン
sudo lsof +D /var/log/myapp
# ロックされたデバイス(マウントポイント)を確認
sudo lsof /mnt/data
“`
### ステップ2: アドバイザリロックの状態を確認する
カーネルが保持しているロック情報は`/proc/locks`で確認できます。
“`bash
# 現在のロック一覧を表示
cat /proc/locks
# 特定PIDのロックのみ抽出
cat /proc/locks | grep ” 12345 ”
# プロセスが保持するファイルディスクリプタを確認
ls -l /proc/12345/fd/
# flockの状態を簡易チェック
sudo flock -n /var/lock/myapp.lock -c “echo ロック取得可能” || echo ロック中
“`
### ステップ3: プロセスを安全に終了する
ロック原因のプロセスを段階的に終了します。
“`bash
# 通常終了シグナルを送信(推奨)
sudo kill 12345
# 数秒待っても終了しない場合は強制終了
sudo kill -9 12345
# fuserで対象ファイルを開くプロセスをまとめて終了
sudo fuser -k /var/log/myapp/app.log
# プロセス名で終了
sudo pkill -f “myapp –daemon”
“`
### ステップ4: ロックファイルを削除して復旧する
パッケージマネージャや独自スクリプトのロックファイルを掃除します。
“`bash
# aptのロックファイルを削除(プロセスが居ないことを確認後)
sudo rm /var/lib/dpkg/lock-frontend /var/lib/dpkg/lock
sudo rm /var/lib/apt/lists/lock /var/cache/apt/archives/lock
# dpkgの状態を修復
sudo dpkg –configure -a
# yum/dnfのロックファイル
sudo rm -f /var/run/yum.pid
# スクリプトで安全にロックを使う例(flock)
flock -x -w 10 /var/lock/myapp.lock -c “/usr/local/bin/backup.sh”
“`
## 注意事項
– `kill -9`はプロセスにクリーンアップの機会を与えないため、必ず通常killを先に試す
– ロックファイルを削除する前に、必ず該当プロセスが本当に動作していないことをpsで確認する
– ネットワークファイルシステム(NFS)ではロックの伝播が遅延することがある
– アドバイザリロックは協調的な仕組みのため、ロックを無視するプログラムには無力である
## まとめ
1. **調査の基本**: lsof・fuser・/proc/locksでロック元を特定する
2. **段階的終了**: TERMシグナル→9番シグナルの順で安全に終了させる
3. **dpkgロック**: 削除前にプロセスの不在を必ず確認する
4. **flock活用**: スクリプトの二重起動防止に最適な仕組み
5. **NFS注意**: 分散環境ではロック挙動が異なることを意識する
関連記事:
– [lsofコマンドで開いているファイルを確認する方法](/articles/linux-lsof-command/)
– [killコマンドでプロセスを終了させる方法](/articles/linux-kill-process/)
– [Linuxのプロセス管理コマンドまとめ](/articles/linux-process-management/)




