udev 規則在交流電/電池插入/拔出事件上啟動指令

udev 規則在交流電/電池插入/拔出事件上啟動指令

為了節省電池,我想在筆記型電腦使用電池運行時關閉效果(合成器)。我想用 udev 規則來實現這一點。

  • 創建了一個文件/etc/udev/rules.d/99-myrule.rules
ACTION=="change", SUBSYSTEM=="power_supply", RUN+="/usr/bin/startcompton.sh"

每次您從筆記型電腦連接/斷開交流電源時,都會觸發此規則。

然後我用以下內容更新規則:sudo udevadm control -R

遺憾的是,當連接/斷開電源時,這不會觸發任何東西。

我的系統是Arch linux。

答案1

長話短說:

  1. 讓 udev 規則執行一個腳本,以在交流電源斷開時終止您的應用程式 (compton)。

  2. 再次啟動它並不簡單 - 創建一個 systemd 服務來啟動您的應用程序,然後使用 udev 規則來啟動該服務。

  3. 若要測試您的 udev 規則,請使用udevadm control --reload-rules && udevadm trigger


答:

所以我找到了一個可行的解決方案。這個問題由 2 個問題組成,所以讓我們分解一下:

  1. 編寫 udev 規則以在交流電/電池插入/拔出時運作。
  2. 如何從 udev 規則啟動像 compton 這樣的 GUI 應用程式。

編寫 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 應用程式:

烏德夫人關於使用 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為您的用戶名。

%hand%t是由$HOMEand/run或替換的說明符$XDG_RUNTIME_DIR。請參閱systemd.unit(5)了解更多詳情。

Environment="XAUTHORITY=/home/USERNAME/.Xauthority"如果您想要 GUI 應用程序,則該行是必須的。請參見這個答案

最後,在 udev 規則中,不要啟動 GUI 應用程式(在我們的例子中為 compton),而是啟動服務:

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

答案2

現有的答案讓我開始,但我想我應該分享我的最終結果- 我的用例是當筆記型電腦失去交流電源時做一些事情(實際上是由於奇怪的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 工作正常。

有趣的資源,可用來改進上述內容:

相關內容