調試systemd服務

調試systemd服務

我正在嘗試創建一個守護進程來監視系統的 CPU 溫度並在時脈頻率變得太高時調整時脈頻率,但我以前從未編寫過守護進程,而且我不確定我是否做得正確。

/usr/local/lib我根據以下內容在 as內的資料夾中建立了兩個文件文件層次結構throttle_daemon裡面叫throttle_daemonand throttle_daemon.service,然後我聯絡throttle_daemon.service/etc/systemd/system/throttle_daemon.service

這是throttle_daemon

# !/bin/bash

export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
export DISPLAY=:1

CPU_TEMP=$(sensors -f | grep -Po "Tdie:\s*\+\d+" | grep -Po "\d+")

# su - aaron -c "/usr/bin/notify-send 'CPU Throttle Daemon' 'CPU Temp is $CPU_TEMP'"

if [ $CPU_TEMP -ge 140 ]; then
    su - aaron -c "notify-send 'CPU Throttle Daemon' 'Throttling CPU'"
    touch /var/tmp/throttle.flag
    for cpu in /sys/devices/system/cpu/cpu*/; do
        cpu=${cpu%*/}  # Remove the trailing "/"
        echo "3200000" | sudo tee "$cpu/cpufreq/scaling_max_freq"
    done
elif [ $CPU_TEMP -le 113 ]; then
    if [ -f /var/tmp/throttle.flag ]; then
        su - aaron -c "notify-send 'CPU Throttle Daemon' 'Un-Throttling CPU'"
        for cpu in /sys/devices/system/cpu/cpu*/; do
            cpu=${cpu%*/}  # Remove the trailing "/"
            echo "3600000" | sudo tee "$cpu/cpufreq/scaling_max_freq"
        done
        rm /var/tmp/throttle.flag
    fi
fi

和我的throttle_daemon.service

[Unit]
Description="CPU Throttle Service"

[Service]
Type=simple
BusName=unix:path=/run/usr/1000/bus
NotifyAccess=all
Restart=always
RestartSec=1s
Environment=DBUS_SESSION_BUS_ADDRESS=unix:abstract=/run/user/1000/bus
ExecStart=/usr/local/lib/throttle_daemon/throttle_daemon

[Install]
WantedBy=multi-user.target

當我使用命令列從命令列運行腳本時,watch -n 1 sudo ./throttle_daemon它會按預期工作,但當我設定服務時則不會。當我sudo systemctl start throttle_daemon.service沒有發出任何錯誤時,但它也沒有做任何事情。

我本來希望notify-send每秒 ping 一次我的 cpu 當前溫度,為什麼不呢?

答案1

我發現我遇到的問題是我/bin/bashExecStart=線路上丟失了

所以我需要改變:

ExecStart=/usr/local/lib/throttle_daemon/throttle_daemon

ExecStart=/bin/bash /usr/local/lib/throttle_daemon/throttle_daemon

我還缺少超時配置,我需要添加:

StartLimitBurst=0

到我的[Service]部分,之後,我的程式按預期運行。

我還更改WantedBygraphical.target而不是multi.user.target因為我正在運行桌面,並且我覺得如果我在沒有 x 伺服器的終端機上運行它,通知會崩潰,但我無法驗證這一點。

答案2

除非我弄錯了,notify-send 使用 dbus 來發送通知。首先,您的服務預設以 root 身分執行,因為它是一個系統單元(基於您放置 .service 檔案的路徑)。其次,如果它必須以 root 身分執行,您需要確保notify-send能夠存取普通使用者的會話 dbus 套接字。現代發行版中通常是這樣的/run/user/1000/bus(假設您的使用者 ID 是 1000,請參閱id --user此使用者)。

您可以將其新增至您的單元檔案:Environment=DBUS_SESSION_BUS_ADDRESS=unix:abstract=/run/user/1000/bus

不完全確定這是否允許notify-send正確發送訊息。可能有一些策略(polkit 或 dbus 策略)阻止其他使用者與套接字上的會話 dbus 守護程式公開的軟體介面進行對話。

相關內容