Claudio Borges

Technical blog about Linux, BSD, Mac OS X, Games and etc.

Truncando um arquivo aberto que foi deletado

without comments

As vezes acontece de termos um arquivo aberto que foi deletado mas que ainda está sendo usado por algum processo. Muitas vezes este processo é de uma aplicação que não podemos reiniciar, seja por ser uma aplicação muito crítica, ou em muito dos casos você tenha “receio” de reiniciar e ocasionar algum problema. Só que você precisa liberar o espaço livre que este processo está “segurando”.

No exemplo abaixo, tenho uma partição com 141G ocupados e “apenas” 34G livres.

[bash]
root@dbserver:~# df -h
Filesystem Size Used Avail Use% Mounted on
rootfs 15G 1.1G 13G 8% /
udev 10M 0 10M 0% /dev
tmpfs 1.2G 264K 1.2G 1% /run
/dev/mapper/VolGroup00-lv_root 15G 1.1G 13G 8% /
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 2.4G 0 2.4G 0% /run/shm
/dev/mapper/VolGroup00-lv_tmp 3.8G 72M 3.5G 2% /tmp
/dev/mapper/VolGroup00-lv_var 184G 141G 34G 81% /var
root@dbserver:~#
[/bash]

Verificando o tamanho de todos os diretórios dentro do /var.

[bash]
root@dbserver:/var# du -shc *
3.9M backups
85M cache
7.3G lib
4.0K local
12K lock
282M log
16K lost+found
431M mail
4.0K opt
172K run
108K spool
4.0K tmp
16K www
8.0G total
root@dbserver:/var#
[/bash]

Reparem no exemplo acima que temos apenas 8.0G ocupados. Então, o que está consumindo tanto espaço em disco? Usando o lsof conseguimos descobrir quem é:

[bash]
root@dbserver:/var# lsof /var/ | grep deleted
mysqld 1850 mysql 10w REG 253,2 141891360059 2424897 /var/log/mysql/mysql.log.1 (deleted)
[/bash]

Um único arquivo de log do mysql consumindo mais de 130G de espaço é complicado não é mesmo? Com o número do processo, conseguimos saber qual arquivo iremos truncar:

[bash]
root@dbserver:/var# ls -latr /proc/1850/fd/ | grep -i deleted
lrwx—— 1 root root 64 Mar 12 01:01 7 -> /tmp/ibz7M8HX (deleted)
lrwx—— 1 root root 64 Mar 12 01:01 6 -> /tmp/ibT0GdaA (deleted)
lrwx—— 1 root root 64 Mar 12 01:01 5 -> /tmp/ibuilBCc (deleted)
lrwx—— 1 root root 64 Mar 12 01:01 4 -> /tmp/ibKEdZ4O (deleted)
lrwx—— 1 root root 64 Mar 12 01:01 11 -> /tmp/ibotm0Yo (deleted)
l-wx—— 1 root root 64 Mar 12 01:01 10 -> /var/log/mysql/mysql.log.1 (deleted)
root@dbserver:/var# > /proc/1850/fd/10
[/bash]

Nos comando acima, primeiro verificamos o número do FD (file descriptor) do arquivo e logo na sequência, truncamos todo o conteúdo do arquivo.

Obs: Muito cuidado pois um determinado processo utiliza vários FDs, você tem que ter certeza absoluta de qual arquivo irá truncar, pois pode “sem querer” apagar um arquivo válido e neste caso já era. Apenas o backup lhe salvará.

[bash]
root@dbserver:/var# df -h
Filesystem Size Used Avail Use% Mounted on
rootfs 15G 1.1G 13G 8% /
udev 10M 0 10M 0% /dev
tmpfs 1.2G 264K 1.2G 1% /run
/dev/mapper/VolGroup00-lv_root 15G 1.1G 13G 8% /
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 2.4G 0 2.4G 0% /run/shm
/dev/mapper/VolGroup00-lv_tmp 3.8G 72M 3.5G 2% /tmp
/dev/mapper/VolGroup00-lv_var 184G 8.2G 166G 5% /var
[/bash]

Depois do arquivo truncado, agora o espaço da partição está ok.

Written by but3k4

March 12th, 2014 at 5:06 pm

Leave a Reply