Debuggen des systemd-Dienstes

Debuggen des systemd-Dienstes

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/libas erstellt, gemäß derDateihierarchie, genannt, throttle_daemondarin befindet sich throttle_daemonund throttle_daemon.service, dann habe ich throttle_daemon.servicemit 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_daemonfunktioniert es wie erwartet, aber nicht, wenn ich den Dienst einrichte. Wenn ich sudo systemctl start throttle_daemon.servicenichts 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/bashIch 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 WantedByzu graphical.targetanstelle 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-sendauf 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 --userdiesem 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.

verwandte Informationen