파일이 몇 번이나 열렸는지 알아보세요.

파일이 몇 번이나 열렸는지 알아보세요.

글쎄, 여기에 두뇌 퍼즐이 있습니다. 현재 Linux 시스템에서 실행 중인 모든 프로세스(모든 모드)에서 특정 파일을 몇 번이나 열었는지 확인하는 방법은 무엇입니까? 즉, 특정 파일/inode를 참조하는 전역적으로(또는 네임스페이스/컨테이너 내에서는 중요하지 않음) 얼마나 많은 파일 설명자가 있습니까?

이를 알아내는 한 가지 방법은 lsof를 사용하여 문제가 되는 파일 이름이 출력에 나타나는 횟수를 계산하는 것입니다. 그러나 이것은 매우 우아해 보이지 않으며 어쨌든 C에서 프로그래밍 방식으로 이와 같은 것을 구현해야 합니다.

편집하다: 또는 유사하지만 다른 질문일 수도 있습니다. 이 질문도 도움이 될 것입니다. 모든 프로세스에서 열리는 특정 파일(파일 시스템의 임의 파일)이므로(아마도 이 파일은 포함되지 않음) 핸들러가 연결되지 않고 어떤 일이 발생하기를 기다리고 있습니다. )?

답변1

현재 열려 있는 파일의 경우 Linux에서는 stat()모든 /proc/*/fd/*파일을 비교하고 inode 번호를 비교한 다음 모두 읽어야 합니다 /proc/*/maps(그리고 inode 번호도 비교해야 합니다).

플래그(비교적 새로운 버전의 Linux 필요) /proc/*/fdinfo/*와 두 번째 열의 파일이 /proc/*/maps읽기 또는 쓰기 모드(또는 둘 다 또는 추가...)로 열려 있는지 확인하세요.

답변2

파일 시스템 이벤트 핸들러를 파일에 첨부하려는 것 같습니다. inotify이것이 올바른 방법입니다. 명령줄 도구와 C API가 있습니다. 나는 그것을 사용하는 전문가가 아니며 명령줄 도구를 몇 분 동안만 사용했기 때문에 코드 예제를 제공하지는 않지만 Google 검색에서 많은 정보를 찾을 수 있습니다.

https://www.ibm.com/developerworks/library/l-inotify/

https://linux.die.net/man/7/inotify

알림을 제공합니다(위 매뉴얼 페이지에서):

IN_ACCESS
File was accessed (read) (*).

IN_ATTRIB
Metadata changed, e.g., permissions, timestamps, extended attributes, link count (since Linux 2.6.25), UID, GID, etc. (*).

IN_CLOSE_WRITE
File opened for writing was closed (*).

IN_CLOSE_NOWRITE
File not opened for writing was closed (*).

IN_CREATE
File/directory created in watched directory (*).

IN_DELETE
File/directory deleted from watched directory (*).

IN_DELETE_SELF
Watched file/directory was itself deleted.

IN_MODIFY
File was modified (*).

IN_MOVE_SELF
Watched file/directory was itself moved.

IN_MOVED_FROM
File moved out of watched directory (*).

IN_MOVED_TO
File moved into watched directory (*).

IN_OPEN
File was opened (*).

관련 정보