私はシステムのCPU温度を監視し、クロックレートが高くなりすぎた場合に調整するデーモンを作成しようとしていますが、これまでにデーモンを作成したことがなく、どれも正しく実行したかどうか確信が持てません。
file-heirarchy に従って、/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-send
が、CPUの現在の温度で毎秒pingすることを期待していましたが、なぜですか?
私が間違っていない限り、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ポリシー)がある場合があります。