시스템 서비스 디버깅

시스템 서비스 디버깅

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

/usr/local/lib다음을 기반으로 내부 폴더에 두 개의 파일을 만들었습니다.파일 계층, 라고 throttle_daemon불리고 , 그리고 에 연락했습니다 .throttle_daemonthrottle_daemon.servicethrottle_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의 현재 온도를 ping 하고 싶었는데 , 왜 안 될까요?

답변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]입장에서는 그 후 내 프로그램이 예상대로 실행됩니다.

나는 또한 데스크톱을 실행하고 있기 때문에 not WantedBy로 변경했으며 x 서버 없이 터미널에서 실행하면 알림이 충돌할 것 같지만 이를 확인할 수는 없습니다.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 정책)이 있을 수 있습니다.

관련 정보