Я пытаюсь создать демон для мониторинга температуры процессора моей системы и регулировки тактовой частоты, если она становится слишком высокой, но я никогда раньше не писал демонов и не уверен, что сделал хоть что-то правильно.
Я создал два файла в папке внутри, /usr/local/lib
как указано виерархия файлов, throttle_daemon
внутри которого называется throttle_daemon
и throttle_daemon.service
, затем я связался throttle_daemon.service
с /etc/systemd/system/throttle_daemon.service
.
Этоthrottle_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
И мойthrottle_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
Когда я запускаю скрипт из командной строки, используя watch -n 1 sudo ./throttle_daemon
его, он работает как и ожидалось, но не когда я настраиваю службу. Когда я вызываю sudo systemctl start throttle_daemon.service
ничего, выдает ошибки, но он также ничего не делает.
Я ожидал, notify-send
что мне каждую секунду будут присылать сообщение о текущей температуре моего процессора. Почему этого не произошло?
решение1
Я обнаружил, что проблема, с которой я столкнулся, заключалась в том, что я пропускал /bin/bash
на своей ExecStart=
линии
поэтому мне нужно было изменить:
ExecStart=/usr/local/lib/throttle_daemon/throttle_daemon
к
ExecStart=/bin/bash /usr/local/lib/throttle_daemon/throttle_daemon
Мне также не хватало конфигурации тайм-аута, мне нужно было добавить:
StartLimitBurst=0
в мой [Service]
раздел, после этого моя программа работает так, как и ожидалось.
Я также изменил WantedBy
на graphical.target
вместо , multi.user.target
потому что я работаю на рабочем столе и мне кажется, что уведомления будут вылетать, если я запущу его на терминале без X-сервера, но я не могу это проверить.
решение2
Если я не ошибаюсь, notify-send использует dbus для отправки уведомления. Во-первых, ваша служба по умолчанию запускается как root, поскольку она является системным блоком (на основе пути, по которому вы поместили свой файл .service). Во-вторых, если она должна запускаться как root, вам нужно убедиться, что notify-send
она сможет получить доступ к сокету сеанса dbus вашего обычного пользователя. Что обычно происходит в современных дистрибутивах /run/user/1000/bus
(при условии, что идентификатор вашего пользователя равен 1000, см. с помощью id --user
этого пользователя).
Вы можете добавить это в свой файл модуля:Environment=DBUS_SESSION_BUS_ADDRESS=unix:abstract=/run/user/1000/bus
Не совсем уверен, позволит ли это notify-send
правильно отправить его сообщение. Могут быть политики (политики polkit или dbus), которые не позволяют другим пользователям общаться с программными интерфейсами, предоставляемыми демоном сеанса dbus на сокете.