バッテリーを節約するために、ラップトップがバッテリーで動作しているときは常にエフェクト (コンポジター) をオフにしたいと思います。これを 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
要約:
AC 切断時にアプリケーション (compton) を強制終了するスクリプトを udev ルールで実行します。
再度起動するのは簡単ではありません。アプリを起動するための systemd サービスを作成し、udev ルールを使用してそのサービスを起動します。
udevルールをテストするには、
udevadm control --reload-rules && udevadm trigger
答え:
そこで、実用的な解決策を見つけました。質問は 2 つの質問で構成されていたので、分解してみましょう。
- AC/バッテリーのプラグ/抜き差し時に実行する udev ルールを記述します。
- 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_DIR
systemd.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 は正常に動作しました。
上記を改善するために使用できる興味深いリソース: