Ich versuche, einen Daemon zu erstellen, der die CPU-Temperaturen meines Systems überwacht und die Taktrate anpasst, wenn sie zu hoch wird. Ich habe jedoch noch nie zuvor einen Daemon geschrieben und bin mir nicht sicher, ob ich irgendetwas richtig gemacht habe.
Ich habe zwei Dateien in einem Ordner innerhalb von /usr/local/lib
as erstellt, gemäß derDateihierarchie, genannt, throttle_daemon
darin befindet sich throttle_daemon
und throttle_daemon.service
, dann habe ich throttle_daemon.service
mit verknüpft /etc/systemd/system/throttle_daemon.service
.
Dies ist dasthrottle_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
Und meinthrottle_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
Wenn ich das Skript über die Befehlszeile ausführe, watch -n 1 sudo ./throttle_daemon
funktioniert es wie erwartet, aber nicht, wenn ich den Dienst einrichte. Wenn ich sudo systemctl start throttle_daemon.service
nichts aufrufe, wird ein Fehler ausgegeben, aber es passiert auch nichts.
Ich habe erwartet notify-send
, dass mir jede Sekunde ein Ping mit der aktuellen Temperatur meiner CPU gesendet wird. Warum geschieht das nicht?
Antwort1
/bin/bash
Ich habe festgestellt, dass das Problem, das ich hatte, darin bestand, dass in meiner ExecStart=
Leitung das fehlte
also musste ich Folgendes ändern:
ExecStart=/usr/local/lib/throttle_daemon/throttle_daemon
Zu
ExecStart=/bin/bash /usr/local/lib/throttle_daemon/throttle_daemon
Mir fehlte auch die Timeout-Konfiguration, ich musste hinzufügen:
StartLimitBurst=0
zu meinem [Service]
Abschnitt, danach läuft mein Programm wie erwartet.
Ich habe auch WantedBy
zu graphical.target
anstelle von geändert multi.user.target
, weil ich den Desktop ausführe und das Gefühl habe, dass die Benachrichtigungen abstürzen würden, wenn ich sie auf dem Terminal ohne den X-Server ausführe, aber ich kann das nicht überprüfen.
Antwort2
Wenn ich mich nicht irre, verwendet notify-send dbus, um die Benachrichtigung zu senden. Erstens wird Ihr Dienst standardmäßig als Root ausgeführt, da es sich um eine Systemeinheit handelt (basierend auf dem Pfad, in den Sie Ihre .service-Datei eingeben). Zweitens müssen Sie, wenn er als Root ausgeführt werden muss, sicherstellen, dass Sie notify-send
auf den Sitzungs-Dbus-Socket Ihres regulären Benutzers zugreifen können. Dies ist in modernen Distributionen normalerweise der Fall /run/user/1000/bus
(vorausgesetzt, die ID Ihres Benutzers ist 1000, siehe mit id --user
diesem Benutzer).
Sie könnten Ihrer Unit-Datei Folgendes hinzufügen:Environment=DBUS_SESSION_BUS_ADDRESS=unix:abstract=/run/user/1000/bus
Ich bin nicht ganz sicher, ob dies das ordnungsgemäße Senden der Nachricht ermöglicht notify-send
. Möglicherweise gibt es Richtlinien (Polkit- oder Dbus-Richtlinien), die verhindern, dass andere Benutzer mit den Softwareschnittstellen kommunizieren, die vom Session-Dbus-Daemon auf dem Socket bereitgestellt werden.