Operation System/Unix & Linux

프로세스가 열고 있는 파일 0으로 만들기

junsuyoun 2023. 8. 3. 22:58
728x90
반응형
  • 리눅스에서 특정 프로세스가 오픈하고 있는 파일 크기를 0으로 만들기
  • 특정 프로세스를 재기동하지 않고 로그성 메시지 파일 크기를 줄이는 방법

rm을 하면 왜 안될까

  • 보통 로그 메시지를 기록하기 위해서는 메시지를 기록할 때 마다 file open,close를 반복하지 않습니다.
  • 프로세스가 기동될 때 file open 하고 프로세스가 종료 될 때 file close를 수행합니다.
  • 필요에 의해서 메시지를 기록 또는 파일을 사용할 때 마다 open, close를 사용하는 경우가 있을 수 있습니다.
  • 본 문서에서는 매번 file open, close를 하는 것이 아닌 재기동 시에만 파일 open, close가 되는 경우 입니다.
[root@tibero sch]$ ls -rlti
total 8
18612964 drwxr-xr-x 2 root root 4096 Aug  3 13:41 source
18612962 -rw-r--r-- 1 root root  195 Aug  3 13:41 time.log

[root@tibero sch]$ rm time.log 
rm: remove regular file 'time.log'? y

[root@tibero sch]$ ls -rlti
total 4
18612964 drwxr-xr-x 2 root root 4096 Aug  3 13:41 source

[root@tibero sch]$ ls -rlti
total 4
18612964 drwxr-xr-x 2 root root 4096 Aug  3 13:41 source
  • 자바 애플리케이션에서 매 1초마다 time.log 파일에 로그를 기록 합니다.
  • 이 상황에서 만약 rm으로 파일을 삭제 했을 경우 time.log 파일에 대한 공간은 확보 되지 않습니다.
[root@tibero sch]$ ps -ef |grep java
root        7084    6822  1 13:41 pts/6    00:00:00 java FileLogger
root        7074    6845  0 13:42 pts/7    00:00:00 grep --color=auto java

[root@tibero sch]$ lsof -p 7084
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF     NODE NAME
java    7084 root  cwd    DIR               0,66     4096 18612964 /root/work/sch/source
java    7084 root  rtd    DIR               0,66     4096 14024776 /
java    7084 root  txt    REG               0,66     8984 18512370 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/bin/java
java    7084 root  mem    REG               0,66   123920 18512407 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/amd64/libnet.so
java    7084 root  mem    REG               0,66   100064 18512408 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/amd64/libnio.so
java    7084 root  mem    REG               0,66 73975048 18512475 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/rt.jar
java    7084 root  mem    REG               0,66  1030832 18512458 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/jfr.jar
java    7084 root  mem    REG               0,66    44320 18512415 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/amd64/libzip.so
java    7084 root  mem    REG               0,66    61560 14812148 /usr/lib64/libnss_files-2.17.so
java    7084 root  mem    REG               0,66   219360 18512397 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/amd64/libjava.so
java    7084 root  mem    REG               0,66    66440 18512414 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/amd64/libverify.so
java    7084 root  mem    REG               0,66    43712 14812160 /usr/lib64/librt-2.17.so
java    7084 root  mem    REG               0,66    88720  9177377 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
java    7084 root  mem    REG               0,66  1136944 14812138 /usr/lib64/libm-2.17.so
java    7084 root  mem    REG               0,66   995840  9177562 /usr/lib64/libstdc++.so.6.0.19
java    7084 root  mem    REG               0,66 18107752 18512419 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/amd64/server/libjvm.so
java    7084 root  mem    REG               0,66  2156592 14812130 /usr/lib64/libc-2.17.so
java    7084 root  mem    REG               0,66    19248 14812136 /usr/lib64/libdl-2.17.so
java    7084 root  mem    REG               0,66    71184 18512384 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/amd64/jli/libjli.so
java    7084 root  mem    REG               0,66    90160 14812177 /usr/lib64/libz.so.1.2.7
java    7084 root  mem    REG               0,66   142144 14812156 /usr/lib64/libpthread-2.17.so
java    7084 root  mem    REG               0,66   163312 14812123 /usr/lib64/ld-2.17.so
java    7084 root  mem    REG               0,66    32768 17958299 /tmp/hsperfdata_root/7042
java    7084 root    0u   CHR              136,6      0t0        9 /dev/pts/6
java    7084 root    1u   CHR              136,6      0t0        9 /dev/pts/6
java    7084 root    2u   CHR              136,6      0t0        9 /dev/pts/6
java    7084 root    3r   REG               0,66 73975048 18512475 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/rt.jar
java    7084 root    4r   REG               0,66  1030832 18512458 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/jfr.jar
java    7084 root    5w   REG               0,66     1443 18612962 /root/work/sch/time.log (deleted)
java    7084 root    6u  unix 0xffff9d9f089d8cc0      0t0  2338807 socket
  • 자바 애플리케이션은 아직 수행되고 있고 자바 애플리케이션이 오픈하고 있는 파일 리스트를 확인 합니다.
  • lsof 명령어로 파일의 오픈 리스트를 확인하면 "/root/work/sch/time.log (deleted)" deleted 정보가 있습니다.
 

lsof: command not found

lsof 유틸리티 설치 lsof CentOS [root@d86a1cc708f1 ~]# yum install -y lsof [root@d86a1cc708f1 ~]# lsof COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1 root cwd DIR 0,138 4096 50464903 / bash 1 root rtd DIR 0,138 4096 50464903 / bash 1 root t

junsuyoun.tistory.com

  • 사실 처음에 rm으로 time.log 파일을 삭제하였지만 아직 물리적으로 파일이 삭제되진 않은거죠.
[root@tibero sch]$ ls -rlti /proc/7084/fd
total 0
2340634 lrwx------ 1 root root 64 Aug  3 13:49 2 -> /dev/pts/6
2343722 lrwx------ 1 root root 64 Aug  3 13:49 6 -> socket:[2341839]
2343721 l-wx------ 1 root root 64 Aug  3 13:49 5 -> /root/work/sch/time.log (deleted)
2343720 lr-x------ 1 root root 64 Aug  3 13:49 4 -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/jfr.jar
2343719 lr-x------ 1 root root 64 Aug  3 13:49 3 -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre/lib/rt.jar
2343718 lrwx------ 1 root root 64 Aug  3 13:49 1 -> /dev/pts/6
2343717 lrwx------ 1 root root 64 Aug  3 13:49 0 -> /dev/pts/6
  • 좀 더 정확하게 보면 리눅스에서는 i-node라는 파일 관리 체계가 존재하는데요.
  • file open 후 프로세스가 아직 오픈하고 있다면 해당 i-node로 파일을 갖고 있습니다.
  • 그러한 이유로 파일을 삭제하더라도 실제로는 파일이 삭제 되지 않은 것이죠.
-- time.log i-node 정보(18612962)
[root@tibero sch]$ ls -rlti
total 8
18612964 drwxr-xr-x 2 root root 4096 Aug  3 13:41 source
18612962 -rw-r--r-- 1 root root  195 Aug  3 13:41 time.log

--- 삭제 후 재 생성

-- time.log i-node 정보(18612965)
[root@tibero sch]$ touch time.log

[root@tibero sch]$ ls -lrti
total 4
18612964 drwxr-xr-x 2 root root 4096 Aug  3 13:41 source
18612965 -rw-r--r-- 1 root root    0 Aug  3 13:52 time.log
  • time.log 파일이 존재하던 위치에서 동일한 파일명으로 생성하게 되더라도 i-node가 다르기 때문에 실제로 다른 파일이 됩니다.
  • 이러한 이유로 프로세스가 메시지성 로그 파일을 오픈하고 있는 상태에서 삭제하더라도 공간 확보가 되지 않습니다.

지우지 않고 파일 크기 줄이기

  • 해당 파일이 메시지성파일이라면 파일 내용을 덮어쓰기 해주면 됩니다.
  • i-node를 건들지 않고 파일 내용만 덮어쓰면 문제가 없습니다.
[root@tibero sch]$ cat time.log 
Logging message at 2023-08-03 13:55:04
Logging message at 2023-08-03 13:55:05
Logging message at 2023-08-03 13:55:06
Logging message at 2023-08-03 13:55:07
Logging message at 2023-08-03 13:55:08
Logging message at 2023-08-03 13:55:09
Logging message at 2023-08-03 13:55:10
Logging message at 2023-08-03 13:55:11
Logging message at 2023-08-03 13:55:12
Logging message at 2023-08-03 13:55:13
Logging message at 2023-08-03 13:55:14
Logging message at 2023-08-03 13:55:15
Logging message at 2023-08-03 13:55:16
Logging message at 2023-08-03 13:55:17
Logging message at 2023-08-03 13:55:18
Logging message at 2023-08-03 13:55:19
Logging message at 2023-08-03 13:55:20

[root@tibero sch]$ echo > time.log

[root@tibero sch]$ cat time.log 
Logging message at 2023-08-03 13:55:25
  • 위와 같이 파일에 빈 값으로 덮어쓰기하더라도 메시지 로그가 정상적으로 기록되는 것을 확인할 수 있습니다.
  • 프로세스의 file open, close 개념과 i-node 개념을 알고 있다면 사용자 실수에 의한 파일 복구도 가능합니다.
  • 해당 내용은 다음 포스팅에서 다루도록 하겠습니다.

728x90
반응형