systemd サービスのデバッグ

systemd サービスのデバッグ

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

/usr/local/libに従って、フォルダ内に2つのファイルを作成しました。ファイル階層throttle_daemon内部に および があるthrottle_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-sendCPU の現在の温度を毎秒 ping で通知されると思っていましたが、なぜ通知されないのでしょうか?

答え1

私が抱えていた問題は、私のライン/bin/bashExecStart=

そのため、変更する必要がありました:

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

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

タイムアウト設定も欠落していたので、以下を追加する必要がありました:

StartLimitBurst=0

私の[Service]セクションに追加した後、私のプログラムは期待どおりに実行されます。

また、デスクトップを実行しているため、 x サーバーのないターミナルで実行すると通知がクラッシュする可能性があると感じたため、WantedBygraphical.target代わりに にmulti.user.target変更しましたが、それを確認することはできません。

答え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。ソケット上のセッション dbus デーモンによって公開されるソフトウェア インターフェイスと他のユーザーが通信できないようにするポリシー (polkit または dbus ポリシー) がある可能性があります。

関連情報