サーバーで大きなファイルが削除されても、ファイルはプロセスによって参照されている可能性があるため、ファイルシステムに空き領域はありません。
lsof を使用しようとしましたが、削除されたファイルがリストされていないようです。 fuser -c
はうまく機能しましたが、特に各プロセスがOracleプロセスであるため、プロセスのリストは各プロセスについてチェックするには長すぎます。
bash-3.2# fuser -c /var
/var: 105o 29999o 20444c 3528c 27258o 7715o 3864o 3862o 2494o 18205o 17450co 17445co 14912co 14824co 14818co 14816o 14814o 8532c 8530c 7633com 7118o 6958o 6790c 6784co 6734o 6693o 6689o 6684o 6675o 6635o 6594c 6548o 6547o 6546o 6545o 6544o 6543o 6542o 6541o 6540o 6537o 6535o 6456o 6128co 6113o 335o 245co 229o 161o 8o
bash-3.2# du -hs /proc
139T /proc
アプリケーションまたはユーザーによってファイルが削除されることがあります。ログファイルと、このファイルが再起動できないプロセスによってまだ参照されていること。
この削除されたファイルへの参照を持つプロセスを再起動せずに、削除されたファイルのディスク領域を再利用するためのグッズ方法はありますか?
find /proc/*/fd -ls 2> /dev/null | grep '(deleted)'
開いているすべてのファイル記述子を検索します。
Grepを削除しました。
StdErrorを/ dev/nullに
出力:
160448715 0 lrwx------ 1 user user 64 Nov 29 15:34 /proc/28680/fd/113 -> /tmp/vteT3FWPX\ (deleted)
またはawkを使用できます
/ proc/*/fd -ls 2>/dev/nullを見つけます| awk '/ deleted/{print $ 11}';
awk出力(bash Ubuntu 12.04でテスト済み):
/proc/28680/fd/113
削除されたすべてのファイルを検索して切り捨てます(bash Ubuntu 12.04でテスト済み):
(自分が何をしているか分からない場合は、これを行わないでください)
find /proc/*/fd -ls 2> /dev/null | awk '/deleted/ {print $11}' | xargs -p -n 1 truncate -s 0
-p実行前にプロンプトtruncate
より良い方法は手動で切り捨てることです
手動切り捨て:
: > /proc/28680/fd/113
または:
> /proc/28680/fd/113
または:
truncate -s 0 /proc/28680/fd/113
楽しい ;)
less
を使用した簡単な例を次に示します。
my10MBfile
というファイルがあるとします。
$ dd if=/dev/zero of=/tmp/my10MBfile bs=1M count=10
10+0 enregistrements lus
10+0 enregistrements écrits
10485760 octets (10 MB) copiés, 0,0454491 s, 231 MB/s
$ ls -l /tmp/my10MBfile
-rw-r--r-- 1 max max 10485760 avril 23 22:49 /tmp/my10MBfile
$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0 14637 9225 4662 67% /
今私はそのファイルをless
で開きます(はい、それはバイナリファイルです...気にしないでください)
$ less /tmp/my10MBfile &
$ lsof -p $(pidof less) | grep 10MBfile
less 29351 max 4r REG 8,3 10485760 521464 /tmp/my10MBfile
次に、そのファイルを削除します
$ rm /tmp/my10MBfile
$ lsof -p $(pidof less) | grep 10MBfile
less 29351 max 4r REG 8,3 10485760 521464 /tmp/my10MBfile (deleted)
$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0 14637 9225 4662 67% /
まだ残っていますが、削除されました。 lsof出力の4列目を見てください。ファイル記述子番号4は読み取り用に開いています(4r)
GDBを実行してみましょう!
$ gdb -p $(pidof less)
GNU gdb (GDB) 7.4.1-debian
....
Attaching to process 29351
....
(gdb) p close(4)
$1 = 0
(gdb) q
それでおしまい!
$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0 14637 9215 4672 67% /
私たちの10 MBは歓迎されます:)
$ ls /proc/29351/fd
0 1 2 3
$ ps 29351
29351 pts/0 S+ 0:00 less /tmp/my10MBfile
プロセスはまだ実行中です。
このコマンドは、Solarisシステムでまだ開いているすべての削除済みファイルを表示します。
find /proc/*/fd -type f -links 0
次のコマンドを使用して、必要なものを切り捨てることができます。
:> /proc/p/fd/x
pはプロセスID、xは最初のコマンドによって返されるファイル記述子です。
一部のプログラムでは、ls
によって報告されたサイズがしばらくしてから切り捨てられる前のサイズに復元されても心配しないでください。ディスク上で使用される実際のサイズは、ファイルが疎なものになるため、はるかに小さくなります。
/proc/<pid>/fd
ディレクトリに移動して、対応するファイル記述子を切り捨てることができます。 fd = 3がpid == 123の削除されたファイルを指しているとしましょう:
# echo "" >! /proc/123/fd/3