시스템 서비스 디버깅

시스템 서비스 디버깅

시스템의 CPU 온도를 모니터링하고 클럭 속도가 너무 높아지면 이를 조정하는 데몬을 만들려고 합니다. 하지만 이전에 데몬을 작성한 적이 없으며 제대로 수행했는지도 모르겠습니다.

/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내 CPU의 현재 온도로 매초마다 핑을 보낼 것으로 예상했는데 , 왜 그렇지 않습니까?

답변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]섹션으로 이동한 후 내 프로그램이 예상대로 실행됩니다.

저도 데스크톱을 실행하고 있어서 x 서버 없이 터미널에서 실행하면 알림이 충돌할 것 같은 느낌이 들기 때문에 대신 WantedBy로 변경했지만 확인할 수는 없습니다.graphical.targetmulti.user.target

답변2

내가 실수하지 않는 한, inform-send는 dbus를 사용하여 알림을 보냅니다. 첫째, 서비스는 시스템 단위이므로 기본적으로 루트로 실행됩니다(.service 파일을 넣은 경로에 따라). 둘째, 루트로 실행해야 하는 경우 notify-send일반 사용자 세션 dbus 소켓에 액세스할 수 있는지 확인해야 합니다 . 일반적으로 최신 배포판에서는 다음과 같습니다 /run/user/1000/bus(사용자 ID가 1000인 경우 id --user이 사용자로 참조).

유닛 파일에 다음을 추가할 수 있습니다.Environment=DBUS_SESSION_BUS_ADDRESS=unix:abstract=/run/user/1000/bus

notify-send이것이 메시지를 제대로 보낼 수 있는지 완전히 확신할 수 없습니다 . 다른 사용자가 소켓의 세션 dbus 데몬에 의해 노출된 소프트웨어 인터페이스와 통신하는 것을 방지하는 정책(polkit 또는 dbus 정책)이 있을 수 있습니다.

관련 정보