web-dev-qa-db-ja.com

systemdサービスのデバッグ

私はシステムのCPU温度を監視し、クロックレートが高くなりすぎた場合に調整するデーモンを作成しようとしていますが、これまでにデーモンを作成したことがなく、どれも正しく実行したかどうか確信が持てません。

file-heirarchy に従って、/usr/local/lib内のフォルダーに2つのファイルを作成しました。これは、throttle_daemonthrottle_daemonが内部にある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することを期待していましたが、なぜですか?

2
iggy12345

私が間違っていない限り、notify-sendはdbusを使用して通知を送信します。まず、サービスはシステムユニットであるため、デフォルトではrootとして実行されます(.serviceファイルを配置したパスに基づく)。次に、ルートとして実行する必要がある場合は、notify-sendは、通常のユーザーのセッションdbusソケットにアクセスできるようになります。これは通常、最新のディストリビューションでは/run/user/1000/bus(ユーザーのIDが1000の場合、id --userこのユーザーとして)。

これをユニットファイルに追加できます:Environment=DBUS_SESSION_BUS_ADDRESS=unix:abstract=/run/user/1000/bus

これがnotify-sendメッセージを適切に送信します。ソケット上のセッションdbusデーモンによって公開されたソフトウェアインターフェイスに他のユーザーが通信できないようにするポリシー(polkitまたはdbusポリシー)がある場合があります。

0
Jeff Dag