나는 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 파일을 사용하는 경우 stat
atime과 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/