- Best way to free disk space from deleted files that are held open
- 7 Answers 7
- 5 Ways to Empty or Delete a Large File Content in Linux
- 1. Empty File Content by Redirecting to Null
- 2. Empty File Using ‘true’ Command Redirection
- 3. Empty File Using cat/cp/dd utilities with /dev/null
- 4. Empty File Using echo Command
- 5. Empty File Using truncate Command
- Linux: освобождение места после удаления файла
- Как освободить место
- Убить процесс
- Обнулить файл
- Как очистить дисковое пространство, если после удаления файла место на диске не освободилось — интерактивный bash скрипт
- 2) Найдем полный путь до дескриптора
- 3) Обнулим файл
- Clean deleted files linux
Best way to free disk space from deleted files that are held open
Hi I have many files that have been deleted but for some reason the disk space associated with the deleted files is unable to be utilized until I explicitly kill the process for the file taking the disk space
$ lsof /tmp/ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME cron 1623 root 5u REG 0,21 0 395919638 /tmp/tmpfPagTZ4 (deleted)
- why is this space not immediately freed when the file is first deleted?
- what is the best way to get back the file space associated with the deleted files?
and please let me know any incorrect terminology I have used or any other relevant and pertinent info regarding this situation.
7 Answers 7
On unices, filenames are just pointers (inodes) that point to the memory where the file resides (which can be a hard drive or even a RAM-backed filesystem). Each file records the number of links to it: the links can be either the filename (plural, if there are multiple hard links to the same file), and also every time a file is opened, the process actually holds the «link» to the same space.
The space is physically freed only if there are no links left (therefore, it’s impossible to get to it). That’s the only sensible choice: while the file is being used, it’s not important if someone else can no longer access it: you are using it and until you close it, you still have control over it — you won’t even notice the filename is gone or moved or whatever. That’s even used for tempfiles: some implementations create a file and immediately unlink it, so it’s not visible in the filesystem, but the process that created it is using it normally. Flash plugin is especially fond of this method: all the downloaded video files are held open, but the filesystem doesn’t show them.
So, the answer is, while the processes have the files still opened, you shouldn’t expect to get the space back. It’s not freed, it’s being actively used. This is also one of the reasons that applications should really close the files when they finish using them. In normal usage, you shouldn’t think of that space as free, and this also shouldn’t be very common at all — with the exception of temporary files that are unlinked on purpose, there shouldn’t really be any files that you would consider being unused, but still open. Try to review if there is a process that does this a lot and consider how you use it, or just find more space.
5 Ways to Empty or Delete a Large File Content in Linux
Occasionally, while dealing with files in Linux terminal, you may want to clear the content of a file without necessarily opening it using any Linux command line editors. How can this be achieved? In this article, we will go through several different ways of emptying file content with the help of some useful commands.
Caution: Before we proceed to looking at the various ways, note that because in Linux everything is a file, you must always make sure that the file(s) you are emptying are not important user or system files. Clearing the content of a critical system or configuration file could lead to a fatal application/system error or failure.
With that said, below are means of clearing file content from the command line.
Important: For the purpose of this article, we’ve used file access.log in the following examples.
1. Empty File Content by Redirecting to Null
A easiest way to empty or blank a file content using shell redirect null (non-existent object) to the file as below:
2. Empty File Using ‘true’ Command Redirection
Here we will use a symbol : is a shell built-in command that is essence equivalent to the true command and it can be used as a no-op (no operation).
Another method is to redirect the output of : or true built-in command to the file like so:
# : > access.log OR # true > access.log
3. Empty File Using cat/cp/dd utilities with /dev/null
In Linux, the null device is basically utilized for discarding of unwanted output streams of a process, or else as a suitable empty file for input streams. This is normally done by redirection mechanism.
And the /dev/null device file is therefore a special file that writes-off (removes) any input sent to it or its output is same as that of an empty file.
Additionally, you can empty contents of a file by redirecting output of /dev/null to it (file) as input using cat command:
Next, we will use cp command to blank a file content as shown.
In the following command, if means the input file and of refers to the output file.
4. Empty File Using echo Command
Here, you can use an echo command with an empty string and redirect it to the file as follows:
# echo "" > access.log OR # echo > access.log
Note: You should keep in mind that an empty string is not the same as null. A string is already an object much as it may be empty while null simply means non-existence of an object.
For this reason, when you redirect the out of the echo command above into the file, and view the file contents using the cat command, is prints an empty line (empty string).
To send a null output to the file, use the flag -n which tells echo to not output the trailing newline that leads to the empty line produced in the previous command.
5. Empty File Using truncate Command
The truncate command helps to shrink or extend the size of a file to a defined size.
You can employ it with the -s option that specifies the file size. To empty a file content, use a size of 0 (zero) as in the next command:
That’s it for now, in this article we have covered multiple methods of clearing or emptying file content using simple command line utilities and shell redirection mechanism.
These are not probably the only available practical ways of doing this, so you can also tell us about any other methods not mentioned in this guide via the feedback section below.
Linux: освобождение места после удаления файла
Бывает так, что место на диске закончилось. Ты нашёл виновника — большущий файл на много гигабайт, удалил его rm ./some-big-file.log , а место так и не освободилось. Как так?!
Всё потому что, этот файл всё ещё открыт каким-то процессом и имеется открытый дескриптор этого файла и поэтому файл просто помечен как deleted, но фактически не удалён.
Нужно найти тот самый процесс и перезапустить его или закрыть дескриптор файла:
lsof +L1
или так
lsof | grep deleted
[user@server:/opt/kafka/logs]$ lsof +L1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME
java 1366 user 4r REG 252,1 255986 0 262629 /opt/kafka/log/huge-file.log (deleted)
$ lsof +L1 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME java 1366 user 4r REG 252,1 255986 0 262629 /opt/kafka/log/huge-file.log (deleted)
Видим, что процесс с PID=1366 имеет файловый дескриптор 4 на чтение файла (read)/opt/kafka/log/huge-file.log.
Смотрим информацию по процессу ps -p 1366 .
Или более подробно ps -p 1366 -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
Как освободить место
Убить процесс
Если процесс не важный, то его можно остановить принудительно: kill -9 1366
Обнулить файл
В этом случае сам файл останется в файловой системе пока процесс не завершится, но размер файла будет 0 байт и место на диске высвободится.
sudo truncate -s 0 /proc/1366/fd/4 or > /proc/1366/fd/4
Как очистить дисковое пространство, если после удаления файла место на диске не освободилось — интерактивный bash скрипт
Восьмая колонка в восьмой колонке мы можем увидеть размер файла в байтах, но нас интересует расположение файлового дескриптора, чтобы первая часть пути к нему это вторая колонка вывода, в данном случаи 4403
2) Найдем полный путь до дескриптора
Выполним команду ниже подставив 4403 после /proc/ и имя файла в паттерн grep
ls -l /proc/4403/fd | grep "/tmp/access.log"
Вывод команды должен выглядеть примерно так:
l-wx------ 1 nginx nginx 64 Oct 30 15:21 29 -> /tmp/access.log (deleted)
Тут мы видим вторую часть пути это 9ая колонка, цифра 29
В итоге полный путь до файлового дескриптора удаленного файла выглядит так:
Также путь до файла для очистки можно получить используя следующую команду (несколько итераций awk используется для дополнительной валидации)
find /proc/*/fd -ls 2> /dev/null | grep '(deleted)' | sed 's#\ (deleted)##g' | awk '' | sort -u -k 2 | grep "/tmp/access.log" | awk ''
3) Обнулим файл
Выполним команду и чтобы очистить место на диске которое до сих пор занимает удаленный файл
truncate -s 0 /proc/4403/fd/29
Чтобы не выполнять эти действия вручную, можно воспользоваться интерактивным скриптом в виде функции, который сделает все за Вас
clean-deleted-space() < DELETED_FILES=$(cat /dev/null | grep -s deleted | grep -Po "\w+\s+\w+\s+/.*" | awk '' | sort -u | grep -v '^0') EOL ) cat END ' $ EOL ONLY_FILES=$(cat ' | grep '^/' $ EOL ) cat EOL echo "Are you sure to release space of deleted files above?" echo select CLEAN in Yes No do if [ "$CLEAN" = "Yes" ] then for DFILE in $ do echo echo File: $DFILE FILE_DESC_ADDR=$(find /proc/*/fd -ls 2> /dev/null | grep '(deleted)' | sed 's#\ (deleted)##g' | awk '' | sort -u -k 2 | grep $DFILE | awk '') if [ "$FILE_DESC_ADDR" != "" ] ; then echo "executing: truncate -s 0 $" truncate -s 0 $ echo done else echo "Truncate deleted file $DFILE is impossible, skip" fi echo done else echo Nothing to do fi break done > clean-deleted-space
Пример использования скрипта:
root@cloudmaker ~ $ clean-deleted-space Will released: 7.37246 Mb /var/log/zabbix/zabbix_agentd.log-20180916 /var/log/salt/minion-20180923 Are you sure to release space of deleted files above? 1) Yes 2) No ? 1 File: /var/log/zabbix/zabbix_agentd.log-20180916 executing: truncate -s 0 /proc/4186/fd/1 done File: /var/log/salt/minion-20180923 executing: truncate -s 0 /proc/4213/fd/6 done
Clean deleted files linux
Пользуясь Linux, можно столкнуться с ситуацией, когда диск переполнен. Вы хотите освободить место на диске, но когда смотрите сколько занимают Ваши файлы, то оказывается что они занимают намного меньше пространства, чем занято на диске…
Выглядит это приблизительно так:
Файлы могут быть визуально удалены, но еще заняты какими-либо процессами. Поэтому их невозможно удалить по-настоящему с диска. Для нахождения таких файлов используйте команду:
Эти файлы почемены как “(deleted)”, но до сих пор находятся на диске.
Аналогично можно найти с помощью awk:
# find /proc/*/fd -ls 2> /dev/null | awk ‘/deleted/ ‘;
Мы увидим номер процесса и номер файлового дескриптора (fd), который нам и нужен.
Вручную можно “освободить” эти файлы так:
Где $PROC – номер процесса, а $FD – номер файлового дескриптора
# truncate -s 0 /proc/$PROC/fd/$FD
Чтобы пройтись по всем таким файлам разом, выполняем эту команду ( ВНИМАНИЕ! УБЕДИТЕСЬ В ТОМ, ЧТО ВЫ УВЕРЕНЫ В ТОМ, ЧТО ДЕЛАЕТЕ 🙂 ) :
# find /proc/*/fd -ls 2> /dev/null | awk ‘/deleted/ ‘ | xargs -p -n 1 truncate -s 0
Останется только подтверждать “усечение” кнопками y и Enter.
Вот теперь на диске есть столько свободного места, сколько должно быть:
Итак, в этой заметке мы рассмотрели как освободить место на диске от удаленных файлов (deleted) на Linux. Если Вам есть чем поделиться по этой теме, пишите в комментариях.