참조 프로세스를 다시 시작하지 않고 삭제 된 파일의 여유 공간을 어떻게 복구합니까?


12

서버에서 큰 파일을 삭제해도 프로세스에서 파일을 계속 참조 할 수 있으므로 파일 시스템에 더 많은 여유 공간이 없습니다.

lsof 사용하려고 시도했지만 삭제 된 파일을 나열하지 않은 것 같습니다. fuser -c더 나은 작업을 수행했지만 프로세스 목록이 너무 길어서 각 프로세스에 대해 프로세스를 점검 할 수 없습니다. 특히 각 프로세스가 Oracle 프로세스이기 때문입니다.

bash-3.2# fuser -c /var
/var:      105o   29999o   20444c    3528c   27258o    7715o    3864o    3862o    2494o   18205o   17450co   17445co   14912co   14824co   14818co   14816o   14814o    8532c    8530c    7633com    7118o    6958o    6790c    6784co    6734o    6693o    6689o    6684o    6675o    6635o    6594c    6548o    6547o    6546o    6545o    6544o    6543o    6542o    6541o    6540o    6537o    6535o    6456o    6128co    6113o     335o     245co     229o     161o       8o
bash-3.2# du -hs /proc
 139T   /proc

응용 프로그램이나 사용자 (예 : 로그 파일)가 파일을 삭제하고이 파일을 여전히 다시 시작할 수없는 프로세스에서 참조하고있는 경우가 있습니다.

이 삭제 된 파일에 대한 참조가있는 프로세스를 다시 시작하지 않고 삭제 된 파일의 디스크 공간을 회수하는 상품 방법이 있습니까?


참고로 .. 열린 파일을 삭제하는 더 좋은 방법은 / dev / null을 파일로 복사하는 것입니다cp /dev/null file
Mike

@Mike cp /dev/nullcp복사 할 항목 이 없으므로 널 명령입니다 . 간단한 리디렉션은 엄격하게 동일 :>file하거나 심지어 동일합니다.>file
jlliagre

답변:


12
find /proc/*/fd -ls 2> /dev/null | grep '(deleted)'

열린 파일 디스크립터를 모두 찾으십시오.

그렙이 삭제되었습니다.

/ dev / null에 대한 StdError

산출:

160448715    0 lrwx------   1 user      user            64 Nov 29 15:34 /proc/28680/fd/113 -> /tmp/vteT3FWPX\ (deleted)

또는 awk 를 사용할 수 있습니다

/ proc / * / fd -ls 2 찾기> / dev / null | awk '/ deleted / {print $ 11}';

awk 출력 (bash Ubuntu 12.04에서 테스트) :

/proc/28680/fd/113

삭제 된 모든 파일을 찾아서 자릅니다 (bash Ubuntu 12.04에서 테스트 됨).

(무엇을 해야할지 모르는 경우에는하지 마십시오)

find /proc/*/fd -ls 2> /dev/null | awk '/deleted/ {print $11}' | xargs -p -n 1 truncate -s 0

잘라내기를 실행하기 전에 -p 프롬프트

더 나은 방법은 수동 자르기입니다

수동 자르기 :

: > /proc/28680/fd/113

또는:

> /proc/28680/fd/113

또는:

truncate -s 0 /proc/28680/fd/113

즐겨 ;)


+1이지만 이러한 명령을 실행하려면 sudo도 필요했습니다.
79E09796

6

다음은 간단한 예입니다 less.

파일이 있다고 가정 해 봅시다 my10MBfile.

$ dd if=/dev/zero of=/tmp/my10MBfile bs=1M count=10
10+0 enregistrements lus
10+0 enregistrements écrits
10485760 octets (10 MB) copiés, 0,0454491 s, 231 MB/s

$ ls -l /tmp/my10MBfile
-rw-r--r-- 1 max max 10485760 avril 23 22:49 /tmp/my10MBfile

$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0     14637  9225       4662  67% /

이제 그 파일을 열었습니다 less(예, 이진 파일입니다 ... 걱정하지 마십시오)

$ less /tmp/my10MBfile &

$ lsof -p $(pidof less) | grep 10MBfile
less    29351  max    4r   REG    8,3 10485760 521464 /tmp/my10MBfile

그런 다음 해당 파일을 제거합니다

$ rm /tmp/my10MBfile

$ lsof -p $(pidof less) | grep 10MBfile
less    29351  max    4r   REG    8,3 10485760 521464 /tmp/my10MBfile (deleted)

$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0     14637  9225       4662  67% /

여전히 존재하지만 삭제되었습니다. lsof 출력의 4 번째 열을보십시오. 파일 설명자 번호 4는 읽기 (4r)를 위해 열려 있습니다.

GDB를 실행하자!

$ gdb -p $(pidof less)

GNU gdb (GDB) 7.4.1-debian
....
Attaching to process 29351
....

(gdb) p close(4)
$1 = 0
(gdb) q

그게 다야!

$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0     14637  9215       4672  67% /

우리의 10 MB는 환영합니다 :)

$ ls /proc/29351/fd
0  1  2  3

$ ps 29351
29351 pts/0    S+     0:00 less /tmp/my10MBfile

프로세스가 여전히 실행 중입니다.


2
좋아,하지만 얼마나? 많은 프로세스는 로그 파일에 쓸 수 없으면 단순히 종료됩니다.
longneck

Logrotate가 당신을 위해 이것을 할 수 없습니까?
maxxvw

logrotate는 프로세스에 로그 파일을 닫고 새 파일을 열라는 신호를 보냅니다.
longneck

2

이 명령은 Solaris 시스템에서 여전히 열려있는 모든 삭제 된 파일을 표시합니다.

find /proc/*/fd -type f -links 0

이 명령으로 원하는 것을 잘라낼 수 있습니다.

:> /proc/p/fd/x

p는 프로세스 ID이고 x는 첫 번째 명령에서 반환 한 파일 설명자입니다.

일부 프로그램에서보고 된 ls크기가 잠시 후 잘림 전의 크기로 복원 되는 경우 걱정하지 마십시오 . 디스크에서 사용되는 실제 크기는 이제 파일이 희소 한 크기이므로 훨씬 작습니다.


0

/proc/<pid>/fd디렉토리 로 이동하여 해당 파일 설명자를자를 수 있습니다. fd = 3이 pid == 123의 삭제 된 파일을 가리 킵니다.

# echo "" >! /proc/123/fd/3

이 방법이 작동하는 예가 있습니까? 거기에서 FD를 변경하는 방법을 찾을 수 없습니다
maxxvw

예, 이것은 작동하지만 프로세스의 pid를 찾는 방법은 무엇입니까?
ujjain

-2

이 솔루션들 중 어느 것도 나를 위해 일하지 않았습니다. Bleachbit를 루트로 사용한 후에 만 ​​삭제 된 파일과 관련된 공간을 올바르게 확보 할 수있었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.