Линукс: Фајл је обрисан али и даље заузима место – како ослободити без убијања процеса?

Понекад се деси да рецимо обришемо фајл који заузима 30GB простом командом „rm -f fajl“ – али ако се после окине „df -h“ види се да се простор из неког разлога није ослободио за тих 30 гига за колико је требало да се ослободи. Ово се дешава јер неки процес на систему држи тај фајл отвореним и даље и „не да му да умре тако лако“ и решење је рестартовање или стопирање тог неког процеса….али шта ако се ради о продукционој машини и заустављање или рестарт процеса није изводљив?

Брисањем фајла се само брише линк тог фајла ка његовој физичкој локацији на хард диску и на нивоу фајл система и фајл је и даље ту негде док га нешто друго не прегази и само је питање где је и по том принципу разни софтвери (типа Recuva) раде претрагу фајл система за обрисаним фајловима.

У овом ТЕСТНОМ примеру ћемо обрисати једнан системски Oracle датафајл од око 800MB на апсолутно небитној тест машини – додуше онај најјзајебанији тако да не покушавајте ово нигде и никад у оваквом примеру каквим видите овде који је само симулација јер ми то прво пало на памет, проверићемо да ли је систем ослободио простор и ако није одрадићемо ручно пражњење тог „закључаног“ фајла а наћи ћемо га на основу PID-a процеса и фајл дескриптора.

# Проверавамо простор пре било каквих брисања
[root@kompjuteras-test ~]# df -hm /u01/app/oracle/oradata/orcl/
Filesystem                          1M-blocks  Used Available Use% Mounted on
/dev/mapper/centos_centos7play-root     51175 18355     32821  36% /

# Бришемо системски датафајл који Oracle и даље користи
[root@kompjuteras-test ~]# rm -f /u01/app/oracle/oradata/orcl/system01.dbf

# Проверавамо да ли се простор ослободио после овог брисања и видимо да 
# није, "USED" простор се није променио
[root@kompjuteras-test ~]# df -hm /u01/app/oracle/oradata/orcl/
Filesystem                          1M-blocks  Used Available Use% Mounted on
/dev/mapper/centos_centos7play-root     51175 18355     32821  36% /

# Тражимо који то процес или процеси држе фајл отвореним. Оно што је обележено црвеном бојом 
# су PID процеса и фајл дескриптор и на основу тих информација одрадићемо пражњење фајла
[root@kompjuteras-test ~]# lsof | grep deleted | grep dbf
ora_dbrm_ 24346               oracle  256u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
ora_dbw0_ 24352               oracle  258u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
ora_lgwr_ 24355               oracle  261u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
ora_reco_ 24361               oracle  256u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
ora_mmon_ 24367               oracle  256u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
ora_w001_ 24397               oracle  256u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
ora_aqpc_ 24400               oracle  256u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
ora_cjq0_ 24405               oracle  256u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
ora_q002_ 24561               oracle  256u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
ora_q003_ 24563               oracle  256u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)

# Путања до локације је /proc/PID/fd/фајл-десктиптор, односно у нашем случају /proc/1707/fd/256
# Узели смо први процес са листе. 
[root@kompjuteras-test ~]# ls -l /proc/24346/fd/256
lrwx------. 1 oracle oinstall 64 Nov 24 06:11 /proc/24346/fd/256 -> /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
[root@kompjuteras-test ~]# file /proc/24346/fd/256
/proc/24346/fd/256: broken symbolic link to `/u01/app/oracle/oradata/orcl/system01.dbf (deleted)'

# То је дакле тај фајл, остаје нам само да га испразнимо
[root@kompjuteras-test ~]# echo > /proc/24346/fd/256

# Ако проверимо сад простор видећемо да се ослободио за тих ~800MB
[root@kompjuteras-test ~]# df -hm /u01/app/oracle/oradata/orcl/
Filesystem                          1M-blocks  Used Available Use% Mounted on
/dev/mapper/centos_centos7play-root     51175 17565     33611  35% /

# Проверавамо по PID-у да ли је процес и даље активан. 
[root@kompjuteras-test ~]# ps -fp 24346
UID        PID  PPID  C STIME TTY          TIME CMD
oracle   24346     1  0 06:10 ?        00:00:00 ora_dbrm_orcl

Дакле, у овом случају, фајл који је обрисан а који је држао отвореним Oracle, je испражњен а процес који га је држао је остао активан. Ако се накад буде радио рестарт сервера изгубиће се овај инфо у /proc као и ове ‘(deleted)’ линије из lsof-a. Наравно, с обзиром да смо у ОВОМ ТЕСТНОМ случају, обрисали системски датафајл – база неће моћи да се дигне.