Отладка службы systemd

Отладка службы systemd

Я пытаюсь создать демон для мониторинга температуры процессора моей системы и регулировки тактовой частоты, если она становится слишком высокой, но я никогда раньше не писал демонов и не уверен, что сделал хоть что-то правильно.

Я создал два файла в папке внутри, /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 на сокете.

Связанный контент