AC/バッテリーのプラグ/アンプラグイベントでコマンドを開始するudevルール

AC/バッテリーのプラグ/アンプラグイベントでコマンドを開始するudevルール

バッテリーを節約するために、ラップトップがバッテリーで動作しているときは常にエフェクト (コンポジター) をオフにしたいと思います。これを udev ルールで実現することを考えました。

  • ファイルを作成しました/etc/udev/rules.d/99-myrule.rules:
ACTION=="change", SUBSYSTEM=="power_supply", RUN+="/usr/bin/startcompton.sh"

このルールは、ラップトップから AC を接続または切断するたびにトリガーされるはずです。

次に、ルールを次のように更新します。sudo udevadm control -R

残念ながら、電源を接続/切断しても何もトリガーされません。

私のシステムはArch Linuxです。

答え1

要約:

  1. AC 切断時にアプリケーション (compton) を強制終了するスクリプトを udev ルールで実行します。

  2. 再度起動するのは簡単ではありません。アプリを起動するための systemd サービスを作成し、udev ルールを使用してそのサービスを起動します。

  3. udevルールをテストするには、udevadm control --reload-rules && udevadm trigger


答え:

そこで、実用的な解決策を見つけました。質問は 2 つの質問で構成されていたので、分解してみましょう。

  1. AC/バッテリーのプラグ/抜き差し時に実行する udev ルールを記述します。
  2. udev ルールから compton のような GUI アプリケーションを起動する方法。

AC/バッテリーのプラグ/抜き差し時に実行する udev ルールを記述します。

ファイルを作成/etc/udev/rules.d/60-onbattery.rules:

# Rule for when switching to battery
SUBSYSTEM=="power_supply",ENV{POWER_SUPPLY_ONLINE}=="0",RUN+="/bin/killcompton.sh"

ファイルを作成します/etc/udev/rules.d/61-onpower.rules:

# Rule for when switching to powersupply
SUBSYSTEM=="power_supply",ENV{POWER_SUPPLY_ONLINE}=="1",RUN+="/bin/startcompton.sh"

POWER_SUPPLY_ONLINE環境からどのように取り囲まれているかに注目してくださいENV{...}

また、独自のルールの属性を知りたい場合は、次のコマンドで udev が認識するものを監視します。 udevadm monitor --environment

スクリプトが単なるバックグラウンド タスクであり、GUI 関連のプロセスを呼び出していない場合は、これで完了です。それ以外の場合は、読み続けてください。

udev ルールから compton のような GUI アプリケーションを起動する方法:

からudevマンRUNの使用について:

「これは、実行時間が極めて短いタスクにのみ使用できます...」

つまり、永続的なものを使うべきなのですシステムサービス。サービスファイルを作成します: /etc/systemd/system/compton.service:

[Unit]
Description=Start compton

[Service]
Type=simple
Environment="DISPLAY=:0"
Environment="XAUTHORITY=%h/.Xauthority"
User=USERNAME
ExecStart=/bin/compton --blur-method kawase --write-pid-path %t/compton.pid
PIDFile=%t/compton.pid

[Install]
WantedBy=default.target

USERNAMEユーザー名に置き換えてください。

%hおよび は、およびまたは%tに置き換えられる指定子です。詳細については を参照してください。$HOME/run$XDG_RUNTIME_DIRsystemd.unit(5)

GUIアプリケーションが必要な場合は、この行はEnvironment="XAUTHORITY=/home/USERNAME/.Xauthority"必須です。この回答

最後に、udev ルールで、GUI アプリケーション (この場合は compton) を起動する代わりに、サービスを起動します。

SUBSYSTEM=="power_supply",ENV{POWER_SUPPLY_ONLINE}=="1",RUN+="/bin/systemctl start compton"

答え2

既存の回答から始めましたが、最終的な結果を共有しようと思いました。私のユースケースは、ラップトップの AC 電源が失われたときに何かを実行する (奇妙な PSU の問題のため、実際にはスマート プラグ/リレーの電源を入れ直す) というものでした。

udev ルールは複数行であってはならず、複数行の場合はエスケープする必要があるため、私はつまずいてしまいました。

最終的にできたのは次の通りです:

# cat /etc/udev/rules.d/90-onbattery.rules                                                                                                                                                                                   
SUBSYSTEM=="power_supply",\
  ENV{POWER_SUPPLY_NAME}=="ADP1",\
  ENV{POWER_SUPPLY_ONLINE}=="0",\
  RUN+="/usr/bin/systemctl start power-cycle-outlet.service"
# cat /etc/systemd/system/power-cycle-outlet.service                                                                                                                                                                         
[Unit]
Description=Power Cycle Outlet via Home Assistant

[Service]
User=root
Type=simple
GuessMainPID=false
ExecStart=/usr/sbin/trigger-outlet-powercycle.sh

trigger-outlet-powercycle.shネットワーク呼び出しを行うため、サンドボックスのため udev から直接呼び出すことができず、at動作できませんでしたが、systemd は正常に動作しました。

上記を改善するために使用できる興味深いリソース:

関連情報