bash: cannot create temp file for here-document: No space left on device が表示された時の対処法


エラー概要

cd でディレクトリを移動しよとしてtabを押していたら何度も bash: cannot create temp file for here-document: No space left on device が表示されました。よくよく英語を読むとディスクフルになっていることが分かり、対応しました。

環境はUbuntu(18.04)です。

対応

1. 全体のディスク容量を確認

落ち着いて、dfコマンドでディスク容量を確認します。-h オプションを付けることで、容量が読みやすい状態で表示されます。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev             16G     0   16G   0% /dev
tmpfs           3.2G  114M  3.1G   4% /run
/dev/sda2       219G  208G     0 100% /
tmpfs            16G  784K   16G   1% /dev/shm
(以下略

/dev/sda2 219G 208G 0 100% /とありほぼ一杯になっており、ここの容量を下げる必要があります。

2. 原因のファイルを特定する

ルートディレクトリから順番にディレクトリを辿りつつ、duコマンドでどのファイルが大きいかどうかを確認します。使うコマンドは以下の通り。

sudo du -sh *

単純にduと打ってしまうと、膨大なファイル容量が表示されてしまい、容量の表示も分かりにくいです。上記コマンドは、以下の方法で対応しています。

  • -h オプションで容量を読みやすいものに変える
  • -s オプションでサブディレクトリを含めない結果にする
  • アクセスできないファイルがある場合にはsudoを利用して、ファイル容量を確認できるようにする
  • * を付けることで、カレントディレクトリ直下のディレクトリとファイルの容量を表示する(付けない場合、カレントディレクトリのサイズ)

また、sortを使うことで容量順に表示することも可能です。ただし、この場合、-hを付ける私の環境では正しくソートしてくれなかったので、以下のようなコマンドを使いました。

du -s * | sort -nr

-n で数値の並び替え、-rで逆順にして大きい容量が先に来るようにします。

容量の大きいファイルを特定し、削除可能であることを確認できれば、削除して完了です。

おまけ

head と sort を併せて利用して、容量の大きいファイルから順に数行だけ並べることもできます。

du |sort -nr | head -n 5

ただ、当然ながら大きいファイルであればすぐに消していいなんてことはないので、結局は地道に削除できそうなディレクトリ・ファイルを探していくことになるかと思います。

参考