이것은 완벽하게 작동합니다.
$ inotifywait --event create ~/foo
Setting up watches.
Watches established.
/home/ron/foo/ CREATE bar
그러나 /sys/devices/virtual/net 아래에 tun0 디렉토리가 생성되면 해당 디렉토리가 존재합니다.
$ inotifywait --event create /sys/devices/virtual/net
Setting up watches.
Watches established.
이 폴더는 누구나 읽을 수 있으므로 inotifywait가 작동하길 원합니다.
그럼 내가 뭘 잘못하고 있는 걸까요?
감사해요
답변1
하지만자주 묻는 질문(FAQ)다음에 대한 부분적 지원을 의미합니다.
Q: sysfs(procfs, nfs...)를 볼 수 있나요?
간단히 말해서 그렇습니다. 하지만 몇 가지 제한 사항이 있습니다. 이러한 제한은 커널 버전에 따라 다르며 더 작아지는 경향이 있습니다. 특정 파일 시스템에 대해 읽어 보십시오.
실제로 무엇이 지원될 수 있는지(또는 라이브러리/유틸리티의 inotify 지원보다는 파일 시스템 자체에 대부분 의존하기 때문에 어떤 커널 버전에서) 말하지 않습니다.
간단한 설명은 inotify를 지원하는 것이 실제로 의미가 없다는 것입니다.모든 것/sys
(또는 ) 에서는 /proc
전통적인 의미로 수정되지 않기 때문입니다. 이러한 파일/디렉토리의 대부분은 커널 상태의 스냅샷을 나타냅니다.당신이 그들을 볼 때.
/proc/uptime
1000분의 1초까지 정확한 가동 시간을 포함하는 간단한 예를 생각해 보십시오 . inotify가 초당 100번 "작성"되었음을 알려야 합니까? 별로 유용하지 않을 뿐만 아니라, 이러한 가상의 "쓰기"를 대신하여 inotify 이벤트를 생성할 것이 없기 때문에 성능 문제가 될 수 있고 해결하기 까다로운 문제일 수 있습니다. 커널에서 inotify파일 시스템 API 수준에서 작동.
그래서 상황은 이렇습니다일부/proc/uptime
sysfs 및 procfs의 항목은 예를 들어 액세스(액세스, 열기, 닫기) 시기를 알려주는 inotify 이벤트를 생성 하지만 내 커널에서는 /proc/mounts
파일 시스템이 마운트 및 마운트 해제될 때 어떤 이벤트도 표시하지 않습니다.
Greg Kroah-Hartman이 말한 내용은 다음과 같습니다.
http://linux-fsdevel.vger.kernel.narkive.com/u0qmXPFK/inotify-sysfs 그리고 리누스:
http://www.spinics.net/lists/linux-fsdevel/msg73955.html
(단, 두 스레드 모두 2014년의 스레드입니다.)
즉각적인 문제를 해결하려면 생성 및 삭제된 tun 장치에 대한 트리거를 표시하는 dbus(루트가 필요하지 않음)를 사용할 수 있습니다 (내 장치에는 tun 장치 이름이 표시되지 않고 PtP가 있는 HAL 문자열만 표시됨) (아니요 dbus-monitor --monitor --system
). udevadm monitor
루트 필요) 또는 폴링 디렉터리로 대체합니다(시도:공유 폴더의 새 파일을 모니터링하는 스크립트(Windows 호스트, Linux 게스트)). ( "n"으로 시작하는 파일을 사용하고 주의 udev
할 수도 있지만 이는 매우 나쁜 해킹입니다.)inotifywait -m -r /dev/.udev
답변2
/sys
그리고 /proc
파일 시스템이 아닙니다. 이는 커널 인터페이스이며 파일 시스템처럼 작동합니다.
네트워크 장치를 생성하면 파일 시스템 폴더가 생성되지 않습니다. 데이터가 변경되면 아무도 보지 않아도 일반 파일 시스템이 변경됩니다. 하지만 /sys
콘텐츠는 /proc
누군가가 보는 순간 생성됩니다.
udev
예를 들어 이벤트(스크립트 실행) 가 필요합니다 .