열린 프로세스 파일을 실시간으로 어떻게 모니터링합니까?


41

Linux 시스템 lsof 에서 해당 시점에 프로세스의 열린 파일을 볼 수 있다는 것을 알고 있습니다 . 그러나 프로세스는 파일을 너무 빨리 열고 변경하고 닫을 수 있으므로 "리눅스에서 열린 프로세스 파일 모니터링 (실시간)"에watch 설명 된대로 표준 쉘 스크립팅을 사용하여 파일을 모니터링 할 때 파일을 볼 수 없습니다 (예 :). .

따라서 프로세스를 감사하는 간단한 방법을 찾고 있으며 시간이 지남에 따라 수행 한 작업을 확인합니다. 감사를 시작하지 않고 프로세스를 실행하기 전에 어떤 네트워크 연결을 시도하고 감사를 시작해야하는지 확인하는 것이 좋습니다.

이상적으로, 나는 이것을하고 싶습니다 :

sh $ audit-lsof /path/to/executable
4530.848254 OPEN  read  /etc/myconfig
4530.848260 OPEN  write /var/log/mylog.log
4540.345986 OPEN  read  /home/gert/.ssh/id_rsa          <-- suspicious
4540.650345 OPEN  socket TCP ::1:34895 -> 1.2.3.4:80    |
[...]
4541.023485 CLOSE       /home/gert/.ssh/id_rsa          <-- would have missed
4541.023485 CLOSE socket TCP ::1:34895 -> 1.2.3.4:80    |   this when polling

strace모든 시스템 호출을 보지 못하고 일부 플래그를 사용하여 이것이 가능 합니까?


답변:


49

와 함께 실행

strace -e trace=open,close,read,write,connect,accept your-command-here

아마 충분할 것입니다.

-o프로세스가 stderr로 인쇄 할 수있는 경우 콘솔 이외의 다른 곳에 strace의 출력을 배치 하려면이 옵션 을 사용해야합니다 . 프로세스가 분기되면 -f또는 도 필요합니다 -ff.

아, 그리고 당신도 원할지도 모른다 -t. 그래서 당신은 언제 전화가 갔는지 볼 수있다 .


프로세스가 수행하는 작업에 따라 함수 호출 목록을 조정해야 할 수도 있습니다 getdents. 예를 들어 ls다음을 사용하여 더 나은 샘플을 얻으려면 추가해야했습니다 .

$ strace -t -e trace=open,close,read,getdents,write,connect,accept ls >/dev/null
...
09:34:48 open("/etc/ld.so.cache", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open("/lib64/libselinux.so.1", O_RDONLY) = 3
09:34:48 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@V\0\0\0\0\0\0"..., 832) = 832
09:34:48 close(3)                       = 0
...
09:34:48 open("/proc/filesystems", O_RDONLY) = 3
09:34:48 read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 366
09:34:48 read(3, "", 1024)              = 0
09:34:48 close(3)                       = 0
09:34:48 open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
09:34:48 getdents(3, /* 5 entries */, 32768) = 144
09:34:48 getdents(3, /* 0 entries */, 32768) = 0
09:34:48 close(3)                       = 0
09:34:48 write(1, "file-A\nfile-B\nfile-C\n", 21) = 21
09:34:48 close(1)                       = 0
09:34:48 close(2)                       = 0

1
올바른 방향으로 가고 있습니다. 감사합니다! 보다 사용자 친화적 인 출력을 원하지만 작업을 수행합니다. 이를 위해 더 유사한 인터페이스를 가진 도구를 작성하는 데 시간이 걸릴 수 있습니다. 바이너리의 동작을 실시간으로 검사하기 위해 ncurses 기반 또는 'top'과 같은 도구가 존재할 것으로 기대했습니다.
gertvdijk

어떻게 보시겠습니까? 아마도 strace 출력을보다 친숙한 것으로 바꿀 수 있습니다.
쓸모없는

-o출력을 파일로 푸시하는 데 확실히 사용하려고합니다 . 그런 다음 tail -F strace.output다른 터미널에서 실행 하여 "실시간"업데이트를 얻을 수 있습니다.
peterph

4
옵션 strace을 사용하여 실행중인 프로세스에 연결할 수도 있습니다 -p PID.
Frank Breitling

-y"[p] 파일 디스크립터 인수와 관련된
린트
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.