시스템의 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의 현재 온도를 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.target
multi.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 정책)이 있을 수 있습니다.