【Ubuntu22】アプリが利用しているファイルハンドルが残っているか確認する方法(削除済みファイルの確認)

Ubuntu 22.04を運用していると、

  • アプリが書き込み中のログファイルを誤って削除してしまった
  • ファイルを消したのにディスク容量が減らない
  • サービスを再起動しないと容量が戻らない

といったトラブルが発生することがあります。

これは 削除されたファイルをアプリがまだ掴んでいる(ファイルハンドルが残っている)状態 が原因です。

この記事では、Ubuntu22で

  • 削除済みだが使用中のファイルを確認する方法
  • そのファイルに書き込まれている内容を確認する方法

を解説します。


■ なぜ削除しても容量が減らないのか?

Linuxでは、

  • rmするとディレクトリエントリは削除される
  • しかしプロセスがファイルを開いたままだと
  • 実体は解放されない

という仕組みになっています。

つまり、

見えないが中身は存在している状態

になります。


■ lsofコマンドで削除済みファイルを確認する

削除済みファイルを検索する

lsof | grep deleted

表示例

java   1234  user  5w  REG  8,1  104857600  123456 /var/log/app.log (deleted)

確認ポイント

  • (deleted) が表示されている
  • PID → プロセス番号
  • FD → ファイルディスクリプタ番号(例:5w)

このFD番号が重要になります。


■ 削除済みファイルの中身を見る方法

削除されたファイルは通常のパスでは参照できません。

しかし Linux には /proc という仕組みがあります。


/proc経由で中身を確認する

構文:

cat /proc/PID/fd/FD番号

例:

cat /proc/1234/fd/5

これで、削除されたファイルの現在の内容を確認できます。


リアルタイムで内容を確認する(ログ監視)

tail -f /proc/1234/fd/5

ログファイルのように追跡できます。


バックアップとして保存する

cp /proc/1234/fd/5 /tmp/recovered.log

これで削除済みファイルの内容を復元できます。


■ ディスク容量が減らない場合の確認

df -h
du -sh /var/log

差がある場合は削除済みファイルが疑われます。


■ 対処方法

安全な方法(推奨)

sudo systemctl restart サービス名

プロセス終了

kill 1234

※本番環境では注意


■ まとめ

コマンド確認できる内容用途
lsof | grep deleted削除済みで使用中のファイル確認全体確認
lsof -p PID特定プロセス確認個別確認
cat /proc/PID/fd/FD削除済みファイルの中身確認内容確認
tail -f /proc/PID/fd/FDリアルタイム監視ログ追跡
cp /proc/PID/fd/FD内容復元バックアップ
systemctl restartハンドル解放安全対処

✔ 実務で重要なポイント

  • 削除しても即座に容量は戻らない
  • /proc経由で内容確認・復元可能
  • 本番では安易にkillしない
  • ログローテーション設定を見直す

まずはこのコマンドで確認しましょう。

lsof | grep deleted

コメント

タイトルとURLをコピーしました