Systemd

編寫要在恢復時執行的 systemd 服務

  • January 27, 2022

我的戴爾筆記型電腦受到核心 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"

引用自:https://unix.stackexchange.com/questions/124212