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


11

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

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

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

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


参考のために..開かれたファイルを削除するためのより良い方法は、ファイルには/ dev / nullにコピーすることであるcp /dev/null file
マイク・

@Mike cp /dev/nullは、cpコピーするものがないため、nullコマンドです。単純なリダイレクトは厳密に同等である:>fileか、さらには>file
jlliagre

回答:


11
find /proc/*/fd -ls 2> /dev/null | grep '(deleted)'

開いているすべてのファイル記述子を検索します。

Grepが削除されました。

/ dev / nullへのStdError

出力:

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

truncateを実行する前に-pプロンプト

より良い方法は、手動切り捨てです

手動切り捨て:

: > /proc/28680/fd/113

または:

> /proc/28680/fd/113

または:

truncate -s 0 /proc/28680/fd/113

楽しい ;)


+1、ただしこれらのコマンドを実行するにはsudoも必要
79E09796

6

以下に簡単な例を示し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

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


2
わかりましたが、どのくらいですか?多くのプロセスは、ログファイルに書き込めない場合、単に終了します。
ロングネック

Logrotateはあなたのためにこれを行うことができませんか?
maxxvw

logrotateは、プロセスにシグナルを送信し、ログファイルを閉じて新しいファイルを開きます。
ロングネック

2

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

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

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

:> /proc/p/fd/x

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

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


0

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

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

この方法が機能する例はありますか?そこからFDを変更する方法が見つかりません
-maxxvw

はい、これは機能しますが、プロセスのPIDを見つける方法は?
ウジャイン

-2

これらのソリューションはどれも私にとってはうまくいきませんでした。ルートとしてBleachbitを使用した後にのみ、削除されたファイルに関連付けられたスペースを適切に解放できました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.