web-dev-qa-db-ja.com

参照プロセスを再起動せずに、削除されたファイルの空き領域を回復するにはどうすればよいですか?

サーバーで大きなファイルが削除されても、ファイルはプロセスによって参照されている可能性があるため、ファイルシステムに空き領域はありません。

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

アプリケーションまたはユーザーによってファイルが削除されることがあります。ログファイルと、このファイルが再起動できないプロセスによってまだ参照されていること。

この削除されたファイルへの参照を持つプロセスを再起動せずに、削除されたファイルのディスク領域を再利用するためのグッズ方法はありますか?

12
ujjain
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

楽しい ;)

12
user3439968

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

プロセスはまだ実行中です。

6
maxxvw

このコマンドは、Solarisシステムでまだ開いているすべての削除済みファイルを表示します。

find /proc/*/fd -type f -links 0

次のコマンドを使用して、必要なものを切り捨てることができます。

:> /proc/p/fd/x

pはプロセスID、xは最初のコマンドによって返されるファイル記述子です。

一部のプログラムでは、lsによって報告されたサイズがしばらくしてから切り捨てられる前のサイズに復元されても心配しないでください。ディスク上で使用される実際のサイズは、ファイルが疎なものになるため、はるかに小さくなります。

2
jlliagre

/proc/<pid>/fdディレクトリに移動して、対応するファイル記述子を切り捨てることができます。 fd = 3がpid == 123の削除されたファイルを指しているとしましょう:

# echo "" >! /proc/123/fd/3
0
kofemann