プロセスがファイルを開いている、ファイルをメモリへマッピングしている、またはディレクトリを現在の作業ディレクトリとして使っているために、ファイルシステムがビジー状態のままになることがあります。lsof と fuser はその関係を特定するのに役立ちます。まず調査してください。プロセス停止は運用上の影響を伴う別の判断です。
プロセス利用率 · レッスン 2
lsof と fuser
ファイル、ディレクトリ、マウントポイント、ネットワークソケットを使っているプロセスを特定する方法を学びます。
lsof で開いているファイルを一覧表示する
lsof は “list open files” を意味します。パスを問い合わせ、一致するオープンファイルレコードを表示します。
$ sudo lsof -- /mnt/usb
同じファイルシステム上のディレクトリツリー全体には、多くの実装で +D を使えますが、再帰スキャンには大きな負荷がかかる場合があります。
$ sudo lsof +D /mnt/usb
便利な列には COMMAND、PID、USER、ファイル記述子(FD)、種別、デバイス、NAME があります。FD が cwd のレコードは、そのプロセスがディレクトリを現在の作業ディレクトリとして使っていることを示します。非特権での出力は、ほかのユーザーが所有するプロセスについて不完全な場合があります。
FD 列の cwd は何を示しますか?
fuser で使用プロセスを特定する
fuser は、指定したファイルまたはファイルシステムを使っているプロセス ID を報告します。詳細出力ではユーザー、アクセス種別、コマンド名も表示されます。
$ sudo fuser -v /mnt/usb
引数をマウント済みファイルシステムとして扱い、その内部のファイルへアクセスするプロセスを探すには、procps の fuser が対応するマウントオプションを使います。
$ sudo fuser -vm /mnt/usb
findmnt --target /mnt/usb などで、そのパスが意図したマウントポイントであることを確認します。Bind mount、名前空間、権限、競合状態により、一度の問い合わせで見える内容が変わる場合があります。
調査中に単なる fuser ではなく fuser -v を使う理由は何ですか?
ビジー状態のファイルシステムを扱う
一致した PID をすべて直ちに終了せず、次の順序で慎重に進めます。
- ホスト、パス、マウント元、予定している保守作業を確認する。
- 実用的なら両方のツールでプロセスを特定する。
- 各プロセスを停止できるか、ディレクトリの外へ移動できるか、完了を待てるかを判断する。
- 利用可能ならサービスマネージャーまたはアプリケーションのインターフェースから停止する。
- 再度問い合わせ、アンマウントして結果を検証する。
fuser -k は一致するプロセスへシグナルを送ります。一般的な procps 実装の既定シグナルは SIGKILL なので、正常な終了処理を行えません。明示的に承認された終了が必要なら、適切なシグナルを選び、PID と所有者を確認し、調査から操作までの間にプロセス集合が変わり得ることを理解してください。
fuser -k /mnt/usb が最初のトラブルシューティング手順として不適切なのはなぜですか?
ツールを選ぶ
開いているファイルの詳細レコード、記述子、ソケット情報が必要なら lsof を使います。パスを中心に一致する PID とアクセス種別を見たい場合は fuser を使います。どちらの結果だけでも、そのプロセスを安全に終了できるかは判断できません。
ネットワークソケットには、fuser で明示的なプロトコル名前空間を使うか、ss などソケット向けツールを使います。
$ sudo fuser -v 22/tcp
$ sudo ss -lntp
開いているファイル記述子と所有プロセスの詳細一覧に適したツールはどれですか?
レッスン完了
lsof と fuser を完了しました
プロセス終了を既定の対応とせず、ファイルとファイルシステムの使用状況を調査できるようになりました。
開いているファイルの詳細レコードには
lsofを使う。パス中心の PID とアクセス情報には
fuserを使う。マウントを確認し、権限と競合状態を考慮する。
シグナルを検討する前に、正常な停止を調整する。
再度問い合わせ、アンマウントまたはサービスの結果を検証する。