Servicio de depuración systemd

Servicio de depuración systemd

Estoy intentando crear un demonio para monitorear las temperaturas de la CPU de mi sistema y ajustar la velocidad del reloj si sube demasiado, pero nunca antes había escrito un demonio y no estoy seguro de haberlo hecho bien.

Creé dos archivos en una carpeta dentro de /usr/local/libsegún eljerarquía de archivos, llamado throttle_daemondentro del cual es throttle_daemony throttle_daemon.service, luego me vinculé throttle_daemon.servicea /etc/systemd/system/throttle_daemon.service.

Este es elthrottle_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

Y mithrottle_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

Cuando ejecuto el script desde la línea de comando, watch -n 1 sudo ./throttle_daemonfunciona como se esperaba, pero no cuando configuro el servicio. Cuando llamo sudo systemctl start throttle_daemon.servicenada, se produce un error, pero tampoco hace nada.

Esperaba notify-sendhacerme un ping cada segundo con la temperatura actual en la que se encuentra mi CPU, ¿por qué no es así?

Respuesta1

Descubrí que el problema que tenía era que me faltaba el /bin/bashen mi ExecStart=línea .

entonces necesitaba cambiar:

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

a

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

También me faltaba la configuración del tiempo de espera, necesitaba agregar:

StartLimitBurst=0

a mi [Service]sección, después de eso, mi programa se ejecuta como se esperaba.

También cambié WantedBya graphical.targeten lugar de multi.user.targetporque estoy ejecutando el escritorio y siento que las notificaciones fallarían si lo ejecutara en la terminal sin el servidor x, pero no puedo verificarlo.

Respuesta2

A menos que me equivoque, notify-send usa dbus para enviar la notificación. Primero, su servicio se ejecuta como root de forma predeterminada, ya que es una unidad del sistema (según la ruta en la que colocó su archivo .service). En segundo lugar, si debe ejecutarse como root, debe asegurarse notify-sendde poder acceder al socket dbus de sesión de su usuario habitual. Lo que normalmente es en las distribuciones modernas /run/user/1000/bus(siempre que la identificación de su usuario sea 1000, consulte con id --usereste usuario).

Podrías agregar esto a tu archivo de unidad:Environment=DBUS_SESSION_BUS_ADDRESS=unix:abstract=/run/user/1000/bus

No estoy del todo seguro si esto permitirá notify-sendenviar correctamente su mensaje. Puede haber políticas (polkit o dbus) que impidan que otros usuarios hablen con las interfaces de software expuestas por el demonio dbus de sesión en el socket.

información relacionada