'inotify' 인스턴스에서 모니터링 중인 파일 나열

'inotify' 인스턴스에서 모니터링 중인 파일 나열

나는작은 스크립트각 프로세스에 대한 inotify 모니터 수를 나열합니다. 보통 이렇게 하면 내가 원하는 것을 얻을 수 있지만 지금은 궁금합니다.어느파일이 모니터링되고 있습니다. 나는 이것이 가능하다고 생각하며이노티파이 시계inotify 인스턴스가 감시하는 파일에 해당합니까?

나도생각하다현재 해당 스크립트에 있는 내용을 기반으로 빌드할 수 있습니다. 예를 들어,

sudo find /proc/*/fd -lname anon_inode:inotify  | cut -d "/" -f 3

inotify파일 설명자를 사용하여 프로세스 목록을 가져옵니다. 파일 설명자 중 하나에 대한 정보를 보면 파일 핸들/관심 목록이라고 가정하는 내용을 얻게 됩니다.

$ sudo cat /proc/50679/fdinfo/19
pos:    0
flags:  00
mnt_id: 15
inotify wd:8 ino:640001 sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:01006400feaad211
inotify wd:7 ino:a08da sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:da080a0094019e8f
inotify wd:6 ino:840003 sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:030084005ae9e3df
inotify wd:5 ino:840002 sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:020084000d506c1f
inotify wd:4 ino:840001 sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:01008400e47bab26
inotify wd:3 ino:32004e sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:4e003200488122df
inotify wd:2 ino:320001 sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:01003200545a9f32
inotify wd:1 ino:2 sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:0200000000000000

f_handle:01003200545a9f32해당 파일을 찾고 기본적으로 f_handle/proc/../fdinfo/의 a를 파일 이름으로 변환 할 수 있었으면 좋겠습니다 .

답변1

나는 이 영역을 처리하기 위한 표준 도구를 모릅니다 f_handle. 이는 시스템 호출에 편리 open_by_handle_at(2)하지만 필드가 항상 유효한 것은 아닙니다. 예를 들어 커널은 nfsd이를 제공하지 않습니다.

그러나 Linux에서 모든 파일의 전체 좌표는 여전히 sdevino필드에 보고되는 이전 장치 번호와 inode 번호입니다. 그것은 단지 그것들을 해독하는 문제일 뿐입니다.

두 값 모두 (현재) 16진수 표기법으로 표현됩니다. ino그대로 두고 십진수 표현으로 변환하면 됩니다 .

sdev 반면에 값을 전통적인 "주요 및 부" 장치 번호로 분할해야 하므로 일부 디코딩이 필요합니다. 실제 블록 장치에서 지원하지 않는 파일 시스템에 있는 파일에도 sdev이 필드에 보고되는 고유한 의사 장치 번호가 있습니다.

sdev필드가 숫자를 표현하기 위해 (8 대신) 20비트를 사용하는 Linux가 "거대한 인코딩"이라고 부르는 방식에 따라 인코딩된다고 가정하면 비트 단위로 주요 숫자는 이고 sdev >> 20숫자는 입니다 sdev & 0xfffff. 또는 일반 텍스트 조작 방법을 사용하면 마이너 번호는 가장 오른쪽(최대) 5자리 16진수이고, 메이저 번호는 마지막 5자리 16진수 이전의 모든 숫자입니다. 16진수 숫자가 5개 미만인 경우 주요 번호는 입니다 0.

전공과 부전공을 취득한 후에는대상 프로세스문서 mountinfo. 귀하의 경우는 입니다 . 특히 다음 과 같은 쌍이 있는 라인을 /proc/50679/mountinfo찾습니다.major:minor제삼대지. 줄을 찾았다다섯find필드는 원하는 파일/디렉토리를 찾는 데 필요한 최종 경로입니다.

노트:inotifyin 행에서 가져온 메이저와 마이너는 /proc/*/fdinfo/*16진수로 표시되지만, in은 mountinfo10진수로 표시되므로 에서 검색하기 전에 변환이 필요합니다 mountinfo.

노트:의 다섯 번째 필드에는 필드 자체 또는 <space>, <newline>, <tab> 문자가 경로의 일부인 경우 이스케이프된 8진수 시퀀스가 mountinfo​​포함될 수 있습니다 . 이는 공백이 , a 등 으로 인코딩됨을 의미합니다. 예를 들어 자신의 지정자 에 대한 경로를 제공하여 이스케이프를 해제할 수 있습니다 .\\\040\\134printf(1)%b

노트:네임스페이스(예: 컨테이너)를 설명하려면 find마운트 네임스페이스에서 최종 명령을 실행 해야 합니다.대상 프로세스예를 들어 (귀하의 예에서) 다음과 같습니다.

nsenter -mt 50679 find "$unescaped_path" -inum "$decimal_ino" -print -quit

관련 정보