Линукс: Фајл је обрисан али и даље заузима место – како ослободити без убијања процеса?
Понекад се деси да рецимо обришемо фајл који заузима 30GB простом командом „rm -f fajl“ – али ако се после окине „df -h“ види се да се простор из неког разлога није ослободио за тих 30 гига за колико је требало да се ослободи. Ово се дешава јер неки процес на систему држи тај фајл отвореним и даље и „не да му да умре тако лако“ и решење је рестартовање или стопирање тог неког процеса….али шта ако се ради о продукционој машини и заустављање или рестарт процеса није изводљив?
У овом ТЕСТНОМ примеру ћемо обрисати једнан системски 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. Наравно, с обзиром да смо у ОВОМ ТЕСТНОМ случају, обрисали системски датафајл – база неће моћи да се дигне.
Nemam pojma, samo lupam....
24/11/2018 @ 15:40
Interesantan road to hell… Popločan dobrim namerama.
Sledeći tutorijal je kako u toku run-timea izmeniti bitan fajl nekom procesu sa fake ali sličnim podacima i izvršiti njihovu injekciju u memoriju?
Šalu na stranu, ovaj primer može koristiti ako sys admin slučajno puni bazu podataka sa ćimapor pa da zametne trag. Pusti fajlove na miru ako prostor nije od ključnog značaja, a pri tome se i koriste od nekih procesa.Makar dok ne dođe vreme za održavanje mašine….
Nemam pojma, samo lupam....
24/11/2018 @ 21:51
P.S. Da ne bude zabune….
Moj nik se odnosi na mene i isključivo samo na mene….
Darko
25/11/2018 @ 23:18
Lepo objašnjeno, može nekad biti korisno, mada mislim da je sama postavka neispravna – ne treba brisati fajl koji proces i dalje koristi, zato je sistem tako i osmišljen. Isto tako, u tekstu prvo kaže da je produkcija osetljivo okruženje pa se proces ne sme restartovati, a onda se ipak radi brutalno pražnjenje fajla koji proces i dalje koristi. To može do toga da proces prestane raditi ispravno.
Компјутераш Блог
26/11/2018 @ 16:13
Не брише се овде ништа, него се празни (као црева) 😀