私は新しいHDMIと新しいUSBが接続されたときにそれを検出し、私のRustプログラムに通知しようとします。私のルールは次のとおりです。
$ /etc/udev/rules.d/80-device-detect.rules
KERNEL=="card0-HDMI-A-1", SUBSYSTEM=="drm", ACTION=="change", RUN+="/home/yuutsuna/scripts/hdmi1_changed.sh"
KERNEL=="card0-HDMI-A-2", SUBSYSTEM=="drm", ACTION=="change", RUN+="/home/yuutsuna/scripts/hdmi2_changed.sh"
SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/home/yuutsuna/scripts/usb_added.sh"
SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN+="/home/yuutsuna/scripts/usb_removed.sh"
以下はスクリプトの1つです。
$ ~/script/hdmi1_changed.sh
#!/bin/sh
status=$(cat /sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-HDMI-A-1/status)
busctl --user call com.u2p.DeviceListener /com/u2p/DeviceListener com.u2p.DeviceListener1 NewDevice ssss "HDMI" "$status" "0000:02.0" "test"
USBは同じですが、状態を取得する必要はありません。
これまで私が知る/行動は次のとおりです。
私のRustプログラムが実行されていないと、実行中のスクリプトがクラッシュします(大丈夫です)。
プログラムの実行中にスクリプトを手動で実行すると正常に動作し、プログラムはDBusからメッセージを受け取ります。
プログラムの実行中にHDMIの1つを取り外し/接続すると、コード1で失敗
スクリプトの1つを
echo test >> test.log
次のように変更してみました。ロギングに最適失敗がないため、ルールが機能します。#!/bin/bash
スクリプトのタイトルを次から変更してみました。#!/bin/sh
chmod 777
私のディレクトリとスクリプトで私がしたことスクリプトをから何も変更しない
/bin
に移動しました。~/scripts
どうすればいいのかわかりません... udevを自動的に読み込み、rootとして実行するので大丈夫だと思いますが、なぜ失敗するのかわかりません。