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


13

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

내가 찾고있는 것은 실제 파일에서 /proc/asound/card0/codec#0와 마찬가지로 파일의 변경 사항을 알 수있는 방법입니다 inotifywait(/ proc의 파일을 "의사 파일"로 간주).

이 실행되기 때문에 나는 내 코드 비트 정신을 찾을 수 sleep 1awk86400 번 날 하루 종일을위한 :)

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
topGUI 시스템 모니터와 같은 것들은 /proc짧은 간격에서 그것보다 훨씬 더 많은 것을 읽습니다 . 물론 컴파일 된 실행 파일로 훨씬 더 효율적으로 수행 할 수 있지만 요점은 다음과 같습니다. 정보 폴링은 일반적인 작업입니다.
goldilocks

2
근본적인 문제는 당신에게 고유하지 않기 때문에 (적어도 일부 하드웨어에는) 기성품 솔루션이있을 것으로 기대합니다 -unix.stackexchange.com/questions/25776/…superuser.com/questions를 살펴보십시오. / 339900 / ... . 궁극적 인 소스는 물론 커널 트리 (그리고 드라이버로 구현하기로 결정한 경우 하드웨어 사양)입니다.
peterph

1
이것이에 표시되면 /proc아마도 udev 규칙으로 스크립트를 트리거 할 수 있습니다 . 덜 이상적은 udev 규칙을 따르는 것이 지루한 일이다;)
goldilocks

@peterph 내가 수집 할 수있는 것에서 hda-verb는 매개 변수를 설정하거나 확인하기위한 인터페이스를 제공하지만 매초마다 실행 해야하는 것처럼 보입니다.
Teresa e Junior

@goldilocks 헤드폰을 연결해도 udev-event가 전송되지 않습니다. 아니면 내가 더 놓친 것이 있습니까?
Teresa e Junior

답변:


10

내가 찾고있는 것은 파일의 변경 사항을 알리는 방법입니다.

파일이 아니기 때문에 할 수 없습니다. 이것은 중복 질문이 아니지만 여기에 대한 대답은 이유를 설명합니다.

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

이와 같은 것을 시뮬레이트 할 수있는 유일한 방법은 파일을 주기적으로 읽고 내용을 비교하여 커널의 응답이 변경되었는지 확인하는 것입니다. 이미 수행 한 것처럼 보입니다.

stat파일 을 procfs하면 atime과 mtime은 동일합니다. 일부 파일의 경우 통계 호출이있을 때마다, 다른 사람은 시스템 부팅 중 시간입니다. 첫 번째 경우에는 항상 변경 된 것으로 보이며 두 번째 경우에는 결코 변경되지 않은 것 같습니다.


불행히도 매초마다 폴링해도 상당한 대기 시간 (예 : 500ms)이 추가됩니다. 더 빠르고 효율적인 방법이 있기를 바랐지만 top과 같은 앱이 같은 방식으로 작동한다고 언급 했으므로 그대로 두겠습니다.
Teresa e Junior

@TeresaeJunior 대기 시간이 문제인 경우 (여기에없는 것 같습니다) 예를 들어 폴링의 지속 시간이 계산에 사용되므로 실제 지속 시간의 시간을 지정합니다 (잠자기 요청한 시간 만 사용하지 않음) . 그래도 많은 것 같습니다. 나는 bash 스크립트를 프로파일 링 한 적이 없으므로 여기서 정상적인 것이 무엇인지 알지 못한다 (흠 좋은 질문). awk ==를 호출하면 fork()이와 같은 것들이 비싸다. 언급 한 것처럼 C로 작성된 유틸리티는 더 빠른 방법을 갖습니다. 나는 여전히 당신이 시스템 전체에 많은 부하를 가하고 있다고 생각하지 않습니다.
goldilocks

1
아니요, 죄송합니다. 실제로 헤드폰을 꽂은 시점부터 다음 잠자기까지 약간의 지연이 있습니다. 그러나 나는 수면 시간을 줄일 계획이 없다. 당신의 도움을 주셔서 감사합니다!
Teresa e Junior

4

PulseAudio를 사용하는 pactl subscribe경우이 작업을 수행하십시오.


네 확실합니다! 몇 달 전에 오디오 문제로 인해 PA 4.0을 컴파일 한 후 사용하기 시작했습니다. 데비안 스 테이블의 버전은 2.0이며 (최근 백 포트에 4.0을 업로드했지만) subscribe2.0 은 없습니다 .
Teresa e Junior

2

또한 /proc/폴링을 통해 변경이 허용 되는 일부 파일은 모니터링됩니다 (예 : 파일에 man proc대한 다음 내용을 읽을 수 있음) /proc/self/mounts.

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

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

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

/programming/5070801/monitoring-mount-point-changes-via-proc-mounts


-1

변경된 파일 netlink을 모니터하는 데 사용하십시오 /proc.

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


사이트에 오신 것을 환영합니다. 해당 작업을 수행하는 방법 에 대한 설명을 추가하십시오 netlink. 연결 한 외부 콘텐츠에서는 분명하지 않습니다. 또한 외부 콘텐츠가 변경되거나 제거 될 수 있으므로 (예 : 원래 링크 된 페이지 상단의 통지 참조) 일반적으로 "링크 전용"답변을 사용하지 않는 것이 좋습니다.
AdminBee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.