udev LAN에 접속할 수 없나요?

udev LAN에 접속할 수 없나요?

저는 Raspbian(Bullseye), Logitech Media Server(LMS) 8.2.0 및 Squeezelite 1.9.9와 함께 RPi 4b를 실행하고 있습니다. USB 장치가 연결될 때 Squeezelite 프로세스를 자동으로 시작하기 위해 다음 udev규칙을 정의했습니다.

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", ENV{PRODUCT}=="154e/300a/3", RUN+="/usr/bin/DAC_start.sh"
SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", ENV{PRODUCT}=="154e/300a/3", RUN+="/usr/bin/DAC_stop.sh"

이것은 내 DAC_start.sh스크립트입니다.

#!/bin/sh
######### DAC_start.sh #########
date >> /tmp/udev.log
echo "Starting Squeezelite" >> /tmp/udev.log
sleep 5s
/usr/bin/squeezelite -o hw:CARD=ND8006,DEV=0 -D -n MediaPlayer -d all=debug -f /tmp/sq.log | at now
###############################

이것은 내 DAC_stop.sh스크립트입니다.

#!/bin/sh
######### DAC_stop.sh #########
date >> /tmp/udev.log
echo "Stopping Squeezelite ..." >> /tmp/udev.log
pkill squeezelite
###############################

수동으로(pi 및 루트로) 실행하면 두 스크립트 모두 잘 작동합니다. Squeezelite는 LMS 및 USB 장치에 성공적으로 연결되어 음악을 재생할 수 있습니다. USB DAC를 연결하면 udev규칙도 작동하고 트리거됩니다 (로그 파일에서 볼 수 있음) . 그러나 squeezelite가 시작되면 udevsqueezelite는 동일한 LAN, 실제로는 동일한 시스템에 있는 내 LMS 서버에 연결할 수 없는 것 같습니다. 다음은 Squeezelite 로그 파일입니다(더 중요한 메시지는 맨 아래에 있다고 생각하지만 뭔가 간과한 경우를 대비해 편의를 위해 모두 복사했습니다).

/usr/bin/squeezelite -o hw:CARD=ND8006,DEV=0 -D -n MediaPlayer -d all=debug -f /tmp/sq.log
[16:22:50.362611] stream_init:454 init stream
[16:22:50.362971] stream_init:455 streambuf size: 2097152
[16:22:50.376806] output_init_alsa:936 init output
[16:22:50.377007] output_init_alsa:976 requested alsa_buffer: 40 alsa_period: 4 format: any mmap: 1
[16:22:50.377081] output_init_common:360 outputbuf size: 3528000
[16:22:50.377333] output_init_common:384 idle timeout: 0
[16:22:50.410804] test_open:301 sample rate 1536000 not supported
[16:22:50.410907] test_open:301 sample rate 1411200 not supported
[16:22:50.411049] test_open:301 sample rate 32000 not supported
[16:22:50.411085] test_open:301 sample rate 24000 not supported
[16:22:50.411118] test_open:301 sample rate 22500 not supported
[16:22:50.411151] test_open:301 sample rate 16000 not supported
[16:22:50.411184] test_open:301 sample rate 12000 not supported
[16:22:50.411216] test_open:301 sample rate 11025 not supported
[16:22:50.411249] test_open:301 sample rate 8000 not supported
[16:22:50.411330] output_init_common:426 supported rates: 768000 705600 384000 352800 192000 176400 96000 88200 48000 44100
[16:22:50.500287] output_init_alsa:1002 memory locked
[16:22:50.500456] output_init_alsa:1008 glibc detected using mallopt
[16:22:50.501072] output_init_alsa:1026 unable to set output sched fifo: Operation not permitted
[16:22:50.501080] output_thread:685 open output device: hw:CARD=ND8006,DEV=0
[16:22:50.501156] decode_init:153 init decode
[16:22:50.502046] alsa_open:354 opening device at: 44100
[16:22:50.502132] register_dsd:908 using dsd to decode dsf,dff
[16:22:50.502166] register_alac:549 using alac to decode alc
[16:22:50.502198] register_faad:663 using faad to decode aac
[16:22:50.502229] register_vorbis:385 using vorbis to decode ogg
[16:22:50.502325] register_opus:328 using opus to decode ops
[16:22:50.502361] register_flac:336 using flac to decode ogf,flc
[16:22:50.502392] register_pcm:483 using pcm to decode aif,pcm
[16:22:50.502433] register_mad:423 using mad to decode mp3
[16:22:50.502463] decode_init:194 include codecs:  exclude codecs:
[16:22:50.503117] alsa_open:425 opened device hw:CARD=ND8006,DEV=0 using format: S32_LE sample rate: 44100 mmap: 1
[16:22:50.503159] discover_server:795 sending discovery
[16:22:50.503272] alsa_open:516 buffer: 40 period: 4 -> buffer size: 1764 period size: 441
[16:22:50.503349] discover_server:799 error sending disovery
[16:22:55.504955] discover_server:795 sending discovery
[16:22:55.505246] discover_server:799 error sending disovery
[16:23:00.510091] discover_server:795 sending discovery
[16:23:00.510360] discover_server:799 error sending disovery
[16:23:05.515053] discover_server:795 sending discovery
[16:23:05.515329] discover_server:799 error sending disovery
[16:23:10.519882] discover_server:795 sending discovery
[16:23:10.520185] discover_server:799 error sending disovery
[16:23:15.528387] discover_server:795 sending discovery
[16:23:15.528659] discover_server:799 error sending disovery
[16:23:20.535819] discover_server:795 sending discovery
[16:23:20.536007] discover_server:799 error sending disovery
[16:23:25.541079] discover_server:795 sending discovery
[16:23:25.541333] discover_server:799 error sending disovery
[16:23:30.549470] discover_server:795 sending discovery
[16:23:30.549640] discover_server:799 error sending disovery
[16:23:35.559568] discover_server:795 sending discovery
[16:23:35.559857] discover_server:799 error sending disovery
[16:23:40.568356] discover_server:795 sending discovery
[16:23:40.568646] discover_server:799 error sending disovery
[16:23:45.576730] discover_server:795 sending discovery
[16:23:45.577009] discover_server:799 error sending disovery
[16:23:50.586202] discover_server:795 sending discovery
[16:23:50.586502] discover_server:799 error sending disovery
[16:23:55.596574] discover_server:795 sending discovery
[16:23:55.596872] discover_server:799 error sending disovery
[16:24:00.604989] discover_server:795 sending discovery
[16:24:00.605269] discover_server:799 error sending disovery
[16:24:05.615978] discover_server:795 sending discovery
[16:24:05.616278] discover_server:799 error sending disovery
[16:24:10.625168] discover_server:795 sending discovery
[16:24:10.625472] discover_server:799 error sending disovery
[16:24:15.633952] discover_server:795 sending discovery
[16:24:15.634246] discover_server:799 error sending disovery
[16:24:20.642357] discover_server:795 sending discovery
[16:24:20.642648] discover_server:799 error sending disovery
[16:24:25.650821] discover_server:795 sending discovery
[16:24:25.651113] discover_server:799 error sending disovery
[16:24:30.662745] discover_server:795 sending discovery
[16:24:30.663055] discover_server:799 error sending disovery
[16:24:35.670289] discover_server:795 sending discovery
[16:24:35.670566] discover_server:799 error sending disovery
[16:24:40.674134] discover_server:795 sending discovery
[16:24:40.674460] discover_server:799 error sending disovery
[16:24:45.679650] discover_server:795 sending discovery
[16:24:45.679984] discover_server:799 error sending disovery
[16:24:50.689070] discover_server:795 sending discovery
[16:24:50.689366] discover_server:799 error sending disovery
[16:24:55.697415] discover_server:795 sending discovery
[16:24:55.697709] discover_server:799 error sending disovery
[16:25:00.705845] discover_server:795 sending discovery
[16:25:00.706128] discover_server:799 error sending disovery
[16:25:05.714279] discover_server:795 sending discovery
[16:25:05.714583] discover_server:799 error sending disovery
[16:25:10.723306] discover_server:795 sending discovery
[16:25:10.723601] discover_server:799 error sending disovery
[16:25:15.728709] discover_server:795 sending discovery
[16:25:15.728977] discover_server:799 error sending disovery

Squeezelite가 시작 시 udevLAN에 액세스할 수 없는 것 같나요? 또한 -s 192.168.1.20매개변수(내 LMS의 IP)를 사용하여 Squeezelite를 시작해 보았지만 성공하지 못했습니다. 여전히 LMS 서버에 연결할 수 없습니다. 내가 뭘 잘못하고 있는지 어떤 아이디어가 있습니까?

나는 piCore OS(Tiny Core Linux 배포판)가 있는 RPi에서 위의 방법을 사용했는데 마술처럼 작동했습니다...

답변1

에서 man udev:

실행{유형}

[...]

유형에 따라 특정 이벤트에 대한 모든 규칙이 처리된 후 실행할 프로그램 목록에 프로그램이 추가됩니다.

이는 매우 단기적으로 실행되는 포그라운드 작업에만 사용할 수 있습니다. 장기 실행 이벤트 프로세스는 해당 장치 또는 슬레이브 장치에 대한 모든 추가 이벤트를 차단할 수 있습니다.

데몬이나 기타 장기 실행 프로세스를 시작하는 것은 udev에 적합하지 않습니다. 분리 여부에 관계없이 분기된 프로세스는 이벤트 처리가 완료된 후 무조건 종료됩니다.

따라서 LAN에 액세스할 수 있다고 하더라도(udev가 다소 제한된 프로세스를 실행하는 환경에서는 어려울 수 있음) 큐라이트와 같은 것을 시작하고 중지하는 올바른 방법은 아닙니다.

예를 들어 아래와 같은 시스템 서비스를 사용해보십시오.이 답변.

답변2

@dirkt가 이미 제안했듯이 udevSqueezelite를 프로세스로 시작하는 것은 좋은 생각이 아닙니다. LAN 액세스가 udev다소 제한되어 있으며 어쨌든 잠시 후에 프로세스가 종료됩니다. 이는 Squeezelite를 서비스로 시작하는 데 선호되는 방법입니다.

이를 위해서는 udev다음 규칙을 정의해야 합니다.

# cat /etc/udev/rules.d/50-DAC.rules
SUBSYSTEM=="usb", ACTION=="bind", ENV{PRODUCT}=="154e/300a/3", TAG+="systemd", ENV{SYSTEMD_WANTS}="DAC_sql_start.service"
SUBSYSTEM=="usb", ACTION=="unbind", ENV{PRODUCT}=="154e/300a/3", TAG+="systemd", ENV{SYSTEMD_WANTS}="DAC_sql_stop.service"

나는 bindresp를 사용했습니다. unbindUSB 장치의 작동은 (내가 아는 한) add해당 장치보다 더 강력하다는 것이 입증되었습니다. remove. 게다가 이해할 수 없는 이유로 ENV{...}옆으로 치워두어야 했는데요...SYSTEMD_WANTS

해당 서비스는 다음과 같이 정의되어야 합니다.

# cat /lib/systemd/system/DAC_sql_start.service
[Unit]
Description=Squeezelite by DAC script (start)

[Service]
ExecStart=/usr/bin/DAC_sql.sh start
# cat /lib/systemd/system/DAC_sql_stop.service
[Unit]
Description=Squeezelite by DAC script (stop)

[Service]
ExecStart=/usr/bin/DAC_sql.sh stop

쉘 스크립트를 DAC_sql.sh다음과 같이 수정했습니다.

# cat /usr/bin/DAC_sql.sh
#!/bin/sh
######### DAC_sql.sh #########
#sleep 5s
case $1 in
    "start")
        #date >> /tmp/DAC.log
        #echo "Starting Squeezelite..." >> /tmp/DAC.log
        /usr/bin/squeezelite -o hw:CARD=ND8006,DEV=0 -s 127.0.0.1 -D -n MediaPlayer #-d all=debug -f /tmp/sq.log;;
        ;;
    "stop")
        #date >> /tmp/DAC.log
        #echo "Stopping Squeezelite..." >> /tmp/DAC.log
        systemctl stop DAC_sql_start
        ;;
esac
##############################

이제 예상대로 작동합니다. Squeezelite는 USB 장치가 열릴 때마다(시스템에 바인딩됨) 서비스로 시작됩니다. USB 장치가 꺼지면(시스템에서 바인딩 해제됨) Squeezelite 서비스가 중지됩니다.

관련 정보