Systemd

調試 systemd 服務

  • April 15, 2020

我正在嘗試創建一個守護程序來監視系統的 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每秒用我的 cpu 所處的目前溫度對我進行 ping,為什麼不是呢?

我發現我遇到的問題是我錯過了/bin/bash我的ExecStart=線路

所以我需要改變:

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

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

我也錯過了超時配置,我需要添加:

StartLimitBurst=0

到我的[Service]部分,在那之後,我的程序按預期執行。

我也更改WantedBy為,graphical.target而不是multi.user.target因為我正在執行桌面,如果我在沒有 x 伺服器的終端上執行它,我覺得通知會崩潰,但我無法驗證。

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