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とrootとして)実行すると、両方のスクリプトがうまく機能します。 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サービスが停止します。

関連情報