ファイルを削除せずに空にする必要がある理由
稼働中の Apache・Nginx・アプリケーションなどのプロセスは、ログファイルを開いたままファイルディスクリプタ経由で書き込み続けています。この状態で rm コマンドでファイルを削除しても、プロセスがファイルの実体(inode)を掴み続けているため、ディスク領域はすぐに解放されません。プロセスを再起動するか終了するまで容量は戻らないという点に注意が必要です。
一方、ファイルを削除せずに「中身だけ空にする(ファイルサイズを0バイトに切り詰める)」操作であれば、inode とファイルパスはそのまま残ります。プロセスは同じファイルディスクリプタで書き込みを継続できるため、サービスを停止しなくても安全にログの内容を消去できます。
中身を空にする3つの方法
方法1:シェルのリダイレクトを使う
最もシンプルな方法は、シェルのリダイレクト演算子 > でファイルを0バイトに上書きすることです。
> /var/log/myapp/app.log
ファイルの書き込み権限がない場合は sudo と組み合わせます。ただし sudo > ファイル と直接書いてもリダイレクト自体は元のユーザー権限で処理されるため、sudo sh -c '...' の形にする必要があります。
sudo sh -c '> /var/log/myapp/app.log'
方法2:truncate コマンドを使う
truncate はファイルを指定したサイズに切り詰めるコマンドです。-s 0 で0バイトを指定します。
sudo truncate -s 0 /var/log/myapp/app.log
コマンドの意図が明示的で読みやすく、スクリプトに組み込む際にも扱いやすい書き方です。シェルの種類を問わず同じ動作が期待できるため、cronジョブや自動化スクリプトに向いています。
方法3:cat /dev/null を使う
古くから使われる書き方として、/dev/null(常に空のデバイスファイル)の内容をリダイレクトする方法もあります。
sudo sh -c 'cat /dev/null > /var/log/myapp/app.log'
動作はリダイレクトを使った方法と同じで、ファイルを0バイトに切り詰めます。既存のスクリプトやドキュメントで見かける機会がありますが、現在は truncate やシンプルなリダイレクトで代替できます。
操作後の確認方法
ファイルサイズが0バイトになったかどうかは ls -lh で確認できます。
ls -lh /var/log/myapp/app.log
出力の5列目(サイズ列)が 0 になっていれば切り詰め成功です。ディスク全体の空き容量が増えたかどうかは df -h で確認できます。
df -h /var/log
空にした後もプロセスがログを書き続けているかは、数秒待ってから再度 ls -lh を実行し、ファイルサイズが増加していれば正常に書き込みが継続されています。増えていない場合はプロセスの起動状態を確認してください。
よくあるつまずき
sudo > ファイル が Permission denied になる
sudo を付けてもリダイレクトは呼び出した側のシェルが処理するため、書き込み権限がないファイルに対しては Permission denied になります。sudo sh -c '> ファイル' または sudo truncate -s 0 ファイル の形に変えると解消できます。
ファイルがシンボリックリンクになっている
/var/log/nginx/error.log などシンボリックリンクになっているファイルを対象にした場合、リンク先の実体ファイルが切り詰められます。動作自体に問題はありませんが、ls -l でリンク先を確認してから操作すると安心です。
圧縮済みのローテートファイルが大量に残っている
今回の手順は現在書き込み中のファイルを対象にしています。*.log.1 や *.log.gz などの過去ローテートファイルがディスクを圧迫している場合は、それらも合わせて確認してください。古い世代のファイルは一般的に削除しても問題ありませんが、保管ポリシーに従って判断してください。
根本対策としてのログローテート設定の見直し
今回紹介した手動の切り詰め操作はあくまで応急処置です。ディスクがひっ迫する状況が繰り返す場合は、logrotate の設定(/etc/logrotate.d/ 配下の各ファイル)を見直すことが根本的な対策になります。
ローテートの頻度(daily・weekly)、保持世代数(rotate)、圧縮の有無(compress)を実際の書き込み量に合わせて調整することで、定期的なログの肥大化を防げます。現在の設定内容は次のコマンドで確認できます。
cat /etc/logrotate.d/nginx
対象サービスに合わせてファイル名を読み替えてください。設定変更後は logrotate --debug /etc/logrotate.d/対象ファイル でドライランを実行し、意図したとおりに動作するか確認できます。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
