调试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 守护进程公开的软件接口进行对话。

相关内容