프로세스가 현재 어떤 파일에 쓰고 있는지 확인하는 방법

프로세스가 현재 어떤 파일에 쓰고 있는지 확인하는 방법

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

나는 이것을 사용하여 lsof프로세스에 의해 현재 열려 있는 파일이 무엇인지 알아낼 수 있다는 것을 알고 있지만 물론 Thunderbird는 많은 파일을 열므로 그다지 도움이 되지 않습니다. iostat장치별 통계만 표시합니다.

이 문제는 무작위로 발생하며 나타나는 데 꽤 오랜 시간이 걸릴 수 있으므로 어떤 파일에 가장 많은 쓰기가 있는지 알아내기 위해 Thunderbird를 추적하고 긴 로그를 뒤질 필요가 없기를 바랍니다.

답변1

프로세스가 중단된 동안 프로세스에 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

답변2

루트 액세스 권한이 있는 경우 가장 좋은 도구는 다음과 같습니다.감사 하위 시스템. 이에 대한 문헌은 많지 않습니다(그러나 Loggedfs에 관한 것 이상).이 튜토리얼또는 희귀한 아니면 그냥auditctl매뉴얼 페이지. 여기에서는 데몬이 시작되었는지 확인한 다음 auditctl루트로 실행하는 것으로 충분합니다.

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

/var/log/audit/audit.log이는 pid 1234인 프로세스가 어딘가에 쓸 때마다 로그에 기록됩니다 /home/philipp. 에 비해 오버헤드가 상당히 작습니다 strace.

관련 정보