為了節省電池,我想在筆記型電腦使用電池運行時關閉效果(合成器)。我想用 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
長話短說:
讓 udev 規則執行一個腳本,以在交流電源斷開時終止您的應用程式 (compton)。
再次啟動它並不簡單 - 創建一個 systemd 服務來啟動您的應用程序,然後使用 udev 規則來啟動該服務。
若要測試您的 udev 規則,請使用
udevadm control --reload-rules && udevadm trigger
答:
所以我找到了一個可行的解決方案。這個問題由 2 個問題組成,所以讓我們分解一下:
- 編寫 udev 規則以在交流電/電池插入/拔出時運作。
- 如何從 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
為您的用戶名。
%h
and%t
是由$HOME
and/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 工作正常。
有趣的資源,可用來改進上述內容: