/proc 아래의 파일 변경 사항 알림

/proc 아래의 파일 변경 사항 알림

나는 bash에 헤드폰이 감지되면 헤드폰으로 전환하고, 그렇지 않으면 PulseAudio를 사용하여 외부 USB 스피커로 전환하는 작은 "데몬"을 작성했습니다.

내가 찾고 있는 것은 파일 변경 사항에 대한 알림을 실제 파일인 /proc/asound/card0/codec#0것처럼 받는 방법입니다 (/proc 아래의 파일을 "가짜 파일"로 처리).inotifywait

sleep 1내 코드가 하루 종일 실행되기 때문에 awk(예: 하루에 86400번) 약간 이상하다는 것을 알았습니다 . :)

while sleep 1; do
    _1=${_2:-}
    _2=$(awk '/Pin-ctls/{n++;if(n==4)print}' '/proc/asound/card0/codec#0')

    [[ ${_1:-} = $_2 ]] ||
        if [[ $_2 =~ OUT ]]; then
            use_speakers
        else
            use_internal
        fi
done

저는 다음과 같은 것을 찾고 있습니다(이 예는 작동하지 않습니다).

codec=/proc/asound/card0/codec#0
while inotifywait $codec; do
    if [[ $(awk '/Pin-ctls/{n++;if(n==4)print}' $codec) =~ OUT ]]; then
        use_speakers
    else
        use_internal
    fi
done

이렇게 하면 루프 내의 명령은 파일이 실제로 변경될 때만 실행됩니다 $codec.

답변1

내가 찾고 있는 것은 [프로세스에서] 파일 변경에 대한 알림을 받는 방법입니다.

파일이 아니기 때문에 할 수 없습니다. 중복된 질문은 아니지만,답은 여기에 있습니다이유를 설명했습니다.

/proc커널 인터페이스입니다. 거기에는 실제 파일이 없으므로 변경할 수 없습니다. 핸들에서 읽는 것은필요하다파일을 읽을 때 파일의 데이터가 그에 대한 답입니다.

비슷한 상황을 시뮬레이션하는 유일한 방법은 주기적으로 파일을 읽고 내용을 비교하여 커널의 응답이 변경되었는지 확인하는 것입니다. 이렇게 한 것 같습니다.

procfs 파일을 사용하는 경우 statatime과 mtime은 동일합니다. 일부 파일의 경우 stat 호출 시간이고 다른 파일의 경우 시스템 시작 시간입니다. 첫 번째 경우에는 항상 변하는 것처럼 보이지만 두 번째 경우에는 전혀 변하지 않는 것 같습니다.

답변2

PulseAudio를 사용하는 경우 pactl subscribe다음을 수행하십시오.

답변3

또한 폴링을 통해 특정 파일의 변경 사항을 모니터링하는 것이 허용된다는 점을 명심하세요 /proc/. 예를 들어 이렇게 하면 파일 man proc에 대해 다음을 읽을 수 있습니다 ./proc/self/mounts

/proc/[pid]/mounts (Linux 2.4.19부터) 이 파일은 프로세스의 마운트 네임스페이스에 현재 마운트된 모든 파일 시스템을 나열합니다(mount_namespaces(7) 참조). 이 파일의 형식은 fstab(5)에 문서화되어 있습니다.

커널 버전 2.6.15부터 이 파일은 폴링 가능합니다. 파일을 읽기 위해 연 후 이 파일의 변경(예: 파일 시스템 마운트 또는 마운트 해제)으로 인해 select(2)가 파일 설명자에 예외가 있는 것으로 표시합니다. (2) 및 epoll_wait(2)는 파일에 우선 순위 이벤트(POLLPRI)가 있는 것으로 표시합니다. (Linux 2.6.30 이전에는 이 파일의 변경 사항이 파일 설명자로 표시되었고, select(2)에 대해 읽기 가능으로 표시되었으며, poll(2) 및 epoll_wait(2)에 대해서는 오류 조건으로 표시되었습니다.)

이것이 바로 다음 질문에서 구현되는 것입니다.

https://stackoverflow.com/questions/5070801/monitoring-mount-point-changes-via-proc-mounts

답변4

파일 변경 사항을 netlink모니터링하는 데 사용해 보세요 ./proc

https://mdlayher.com/blog/linux-netlink-and-go-part-1-netlink/

관련 정보