私のラップトップが充電器に接続されているか、切断されたときにudevに特定のスクリプトを実行させたいと思います。
そのためにファイルを作成し、99-local.rules
次の/etc/udev/rules.d
内容を入れました。
ACTION=="change", SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/usr/sbin/onchg.sh"
ACTION=="change", SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/usr/sbin/onbatt.sh"
ただし、ファイルが適切な場所にある場合、システムは「ネットワークインターフェースの上昇」ターゲット中にしばらく停止しているように見え、表示された5分の2分後にタイムアウトします。
ファイルを削除するとうまくいきます。
udevはネットワークインタフェースの起動にどのような関係があり、どのようにできるだけ早く起動しながらもこれらのルールを維持できますか?
答え1
udevadm settle
出力には次の関係がありますsystemctl cat networking
。
ExecStartPre=-/bin/sh -c '[ "$CONFIGURE_INTERFACES" != "no" ] && [ -n "$(ifquery --read-environment --list --exclude=lo)" ] && udevadm settle'
キーman udev
については、次の点を考慮してください。RUN
これは、非常に短期的に実行されるフォアグラウンドジョブでのみ使用できます。長期実行イベントプロセスは、そのデバイスまたはスレーブデバイスに対するすべての追加イベントをブロックできます。
デーモンや他の長期実行プロセスを開始することはudevには適していません。切り離されたかどうかにかかわらず、分岐されたプロセスはイベント処理が完了した後に無条件に終了します。
答え2
Ferencが提供した答えは、問題が私のスクリプトに関連している可能性があるという手がかりを与えました。
実際にノートブックをドッキング/ドッキング解除するたびに、スクリプトはGPUを切り替えてXサーバー(LightDM)を再起動する必要があります。
したがって、udevは起動中にスクリプトを実行したようで、Xを再起動しようとしましたが、明らかに失敗しました。
onbat.sh
/上部に次のコードを追加しましたが、onchg.sh
これですべてがうまくいきます。
# Check if LightDM has already arrived
systemctl status lightdm | grep "running"
not_running=$?
if (( $not_running > 0 ))
then
# LightDM not arrived, exiting for now...
echo "LightDM not arrived, won't switch GPU."
exit
fi