When big files are deleted on a server, the files might still be referenced by processes, so the file system doesn't have more free space.
I tried to use lsof, but it seems it didn't list the deleted files. fuser -c
did better work, but the list of processes is just too long to check it out for each process, especially since each process is an Oracle process.
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
It happens sometimes that a file gets deleted by an application or a user, e.g. a logfile and that this file is still being referenced by a process that cannot be restarted.
Are there goods methods to reclaim disk space on deleted files without restarting the process that has a reference to this deleted file?
Find all opened file descriptors.
Grep deleted.
StdError to /dev/null
Output:
Or you can use awk
find /proc/*/fd -ls 2> /dev/null | awk '/deleted/ {print $11}';
awk output(tested in bash Ubuntu 12.04):
Find and truncate all deleted files(tested in bash Ubuntu 12.04):
(DON'T DO THIS IF YOU DON'T KNOW WHAT YOU DO)
-p prompt before execute truncate
Better way is manual truncate
Manual truncate:
or:
or:
Enjoy ;)
Here is a simple example with
less
:Let's assume we have a file,
my10MBfile
:Now I open that file with
less
(yes, it is a binary file... never mind)Then I remove that file
It is still there, but deleted. Look at the 4th column of the lsof output: File Descriptor number 4 open for Reading (4r)
Let's run GDB!
That's it!
Our 10 MB are welcome back :)
The process is still running.
This command will show all deleted files still open on a Solaris system:
You can truncate the ones you are sure you want with this command:
with p being the process id and x the file descriptor returned by the first command.
Don't worry if with some programs the size reported by
ls
is restored to the size before truncation after a while, the actual size used on disk will be much smaller as the file is now a sparse one.You can try to go to
/proc/<pid>/fd
directory and the truncate corresponding file descriptor. Let's say fd=3 points to deleted file of pid == 123:None of these solutions worked for me. Only after using Bleachbit as root I was able to properly free the space associated with deleted files.