Depurando serviço systemd

Depurando serviço systemd

Estou tentando criar um daemon para monitorar a temperatura da CPU do meu sistema e ajustar a frequência do clock se ficar muito alta, mas nunca escrevi um daemon antes e não tenho certeza se fiz nada certo.

Criei dois arquivos em uma pasta dentro de /usr/local/libconforme ohierarquia de arquivos, chamado throttle_daemondentro do qual está throttle_daemone throttle_daemon.service, então vinculei throttle_daemon.servicea /etc/systemd/system/throttle_daemon.service.

Isto é othrottle_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

E meuthrottle_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

Quando executo o script na linha de comando, watch -n 1 sudo ./throttle_daemonele funciona conforme o esperado, mas não quando configuro o serviço. Quando não chamo sudo systemctl start throttle_daemon.servicenada, há erros, mas também não faz nada.

Eu esperava notify-sendfazer um ping a cada segundo com a temperatura atual em que minha CPU está, por que não está?

Responder1

Descobri que o problema que estava tendo era que estava faltando o /bin/bashna minha ExecStart=linha

então eu precisei mudar:

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

para

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

Também estava faltando a configuração do tempo limite, precisei adicionar:

StartLimitBurst=0

para minha [Service]seção, depois disso, meu programa funciona conforme o esperado.

Também mudei WantedBypara graphical.targetem vez de multi.user.targetporque estou executando a área de trabalho e sinto que as notificações travariam se eu executasse no terminal sem o servidor x, mas não posso verificar isso.

Responder2

A menos que eu esteja enganado, notify-send usa dbus para enviar a notificação. Primeiro, seu serviço é executado como root por padrão, pois é uma unidade de sistema (com base no caminho em que você colocou seu arquivo .service). Segundo, se ele precisar ser executado como root, você precisará ter certeza de que notify-sendserá capaz de acessar o soquete dbus da sessão do usuário normal. O que normalmente acontece nas distros modernas /run/user/1000/bus(desde que o ID do seu usuário seja 1000, veja id --usercomo este usuário).

Você pode adicionar isso ao seu arquivo de unidade:Environment=DBUS_SESSION_BUS_ADDRESS=unix:abstract=/run/user/1000/bus

Não tenho certeza se isso permitirá notify-sendo envio correto da mensagem. Pode haver políticas (políticas polkit ou dbus) que impedem que outros usuários se comuniquem com as interfaces de software expostas pelo daemon dbus da sessão no soquete.

informação relacionada