編寫要在恢復時執行的 systemd 服務
我的戴爾筆記型電腦受到核心 3.14的此錯誤的影響。作為一種解決方法,我寫了一個簡單的腳本
/usr/bin/亮度修復:
#!/bin/bash echo 0 > /sys/class/backlight/intel_backlight/brightnes
(並使其可執行
chmod +x /usr/bin/brightness-fix
:)以及在啟動時執行的呼叫它的 systemd 服務:
/etc/systemd/system/brightness-fix.service
[Unit] Description=Fixes intel backlight control with Kernel 3.14 [Service] Type=forking ExecStart=/usr/bin/brightness-fix TimeoutSec=0 StandardOutput=syslog #RemainAfterExit=yes #SysVStartPriority=99 [Install] WantedBy=multi-user.target
並啟用:
systemctl enable /etc/systemd/system/brightness-fix.service
這就像一個魅力,我可以根據需要控制我的顯示亮度。當筆記型電腦在進入睡眠模式後恢復時出現問題(例如,當關閉筆記型電腦邊緣時):除非我手動執行上面的第一個腳本,否則亮度控制不再起作用:
/usr/bin/brightness-fix
如何創建另一個像我上面的系統服務以在恢復時執行?
編輯: 根據下面的評論,我修改了我
brightness-fix.service
這樣的:[Unit] Description=Fixes intel backlight control with Kernel 3.14 [Service] Type=oneshot ExecStart=/usr/local/bin/brightness-fix TimeoutSec=0 StandardOutput=syslog [Install] WantedBy=multi-user.target sleep.target
我還添加
echo "$1 $2" > /home/luca/br.log
到我的腳本中以檢查它是否實際執行。它實際上也在 resume (post suspend
) 處執行的腳本,但它沒有效果(背光為 100%,無法更改)。我還嘗試了記錄$DISPLAY
,$USER
並且在恢復時,它們是空的。所以我的猜測是腳本在從睡眠中醒來時執行得太早了。有什麼提示嗎?
我知道這是一個老問題,但是以下單元文件對我有用,可以在從睡眠狀態恢復時執行腳本:
[Unit] Description=<your description> After=suspend.target [Service] User=root Type=oneshot ExecStart=<your script here> TimeoutSec=0 StandardOutput=syslog [Install] WantedBy=suspend.target
我相信正是它
After=suspend.target
使它在恢復時執行,而不是在電腦進入睡眠狀態時執行。
作為編寫和啟用單元文件的替代方法,您還可以將 shell 腳本(或腳本的符號連結)放入
/lib/systemd/system-sleep/
.它將在睡眠/休眠之前和恢復時間被呼叫。
來自
man systemd-suspend.service
:在進入系統掛起和/或休眠之前,systemd-suspend.service(以及其他提到的單元,分別)將執行 /usr/lib/systemd/system-sleep/ 中的所有執行檔並將兩個參數傳遞給它們。第一個參數將是“pre”,第二個參數是“suspend”、“hibernate”或“hybrid-sleep”,具體取決於所選的操作。離開系統掛起和/或休眠後,立即執行相同的執行檔,但第一個參數現在是“post”。此目錄中的所有執行檔都是並行執行的,直到所有執行檔都完成後才會繼續執行操作。
用這個測試它:
#!/bin/sh ## This file (or a link to it) must be in /lib/systemd/system-sleep/ logger -t "test" "\$0=$0, \$1=$1, \$2=$2"