프로세스에 의해 현재 작성된 파일을 찾는 방법


9

내 상황은 때때로 특정 프로세스 (이 경우 Thunderbird)가 1 분 정도 사용자 입력에 반응하지 않는 것입니다. 나는 iotop이 시간 동안 그것을 사용 하여 디스크에 많은 것을 썼다는 것을 알았습니다. 이제 어떤 파일에 쓰는지 알고 싶지만 불행히도 iotop열린 파일 (-설명자)이 아닌 프로세스 당 통계 만 제공합니다.

lsof프로세스가 현재 어떤 파일을 열 었는지 알 수 있지만 Thunderbird는 파일을 많이 열었으므로 도움이되지 않습니다. iostat장치 당 통계 만 표시합니다.

문제는 무작위로만 발생하며 표시되는 데 시간이 다소 걸릴 수 있으므로 Thunderbird를 추적하고 긴 로그를 기록하여 어떤 파일이 가장 많은 파일인지 알 수 있기를 바랍니다.


답변:


6

프로세스가 중단되었을 때 strace를 프로세스에 연결하면 (예비 터미널에서 pid를 가져 와서 명령을 미리 큐에 넣을 수 있음) 블로킹 쓰기의 파일 디스크립터가 표시됩니다.

사소한 예 :

$ mkfifo tmp
$ cat /dev/urandom > tmp &
[1] 636226
  # this will block on open until someone opens for reading

$ exec 4<tmp
  # now it should be blocked trying to write

$ strace -p 636226
Process 636226 attached - interrupt to quit
write(1, "L!\f\335\330\27\374\360\212\244c\326\0\356j\374`\310C\30Z\362W\307\365Rv\244?o\225N"..., 4096 <unfinished ...>
^C
Process 636226 detached

고맙게도 프로세스가 실행되는 동안 strace를 연결할 수 있다는 것을 몰랐습니다. 나는 이것을 시도 할 것이다.
Philipp Wendler

1
lsof -p $PID파일 디스크립터가 가리키는 위치를 알기 위해이 정보
를와

1
또는 ls -l /proc/pid/fdLinux
쓸모없는

strace를 사용하여 실제로 내가 알고 싶은 것을 정확하게 찾을 수 있으므로 다시 한번 감사드립니다!
Philipp Wendler

2

나는 당신이 루트 액세스 권한을 가지고 있으며, 가장 좋은 도구는 감사 서브 시스템 이라고 생각합니다 . 그것에 관한 많은 문헌은 없지만 (logsfs 이상); 당신은 시작할 수 있습니다 이 튜토리얼 또는 몇 가지 또는 단지와 man 페이지 . 여기서 데몬이 시작되었는지 확인한 다음 루트 로 실행하면 충분 합니다. auditctlauditctl

auditctl -a exit,always -F pid=1234 -F dir=/home/philipp

이것은 /var/log/audit/audit.logpid 1234로 프로세스가 아래 어딘가에 쓸 때마다 로그에 기록 /home/philipp합니다. 오버 헤드는 상당히 작으며보다 훨씬 작습니다 strace.


감사 서브 시스템을 strace의 흥미로운 대안으로 지적 해 주셔서 감사합니다. 그러나 파일을 열 때만 로그하는 것처럼 보이므로 여기서 도움이되지 않는 것이므로 각 파일에 얼마나 많이 쓰여 있는지 알 수 없습니다.
Philipp Wendler

@PhilippWendler 아. 흠. 추가 -S read -S write(평가되지 않음)를 시도하십시오 .
Gilles 'SO- 악마 그만해'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.