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/lib
según eljerarquía de archivos, llamado throttle_daemon
dentro del cual es throttle_daemon
y throttle_daemon.service
, luego me vinculé throttle_daemon.service
a /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_daemon
funciona como se esperaba, pero no cuando configuro el servicio. Cuando llamo sudo systemctl start throttle_daemon.service
nada, se produce un error, pero tampoco hace nada.
Esperaba notify-send
hacerme 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/bash
en 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é WantedBy
a graphical.target
en lugar de multi.user.target
porque 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-send
de 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 --user
este 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-send
enviar 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.