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/lib
conforme ohierarquia de arquivos, chamado throttle_daemon
dentro do qual está throttle_daemon
e throttle_daemon.service
, então vinculei throttle_daemon.service
a /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_daemon
ele funciona conforme o esperado, mas não quando configuro o serviço. Quando não chamo sudo systemctl start throttle_daemon.service
nada, há erros, mas também não faz nada.
Eu esperava notify-send
fazer 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/bash
na 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 WantedBy
para graphical.target
em vez de multi.user.target
porque 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-send
será 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 --user
como 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-send
o 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.