GPIO 포트를 사용하여 다양한 것을 모니터링하는 데몬이 있습니다. RPi.GPIO 모듈을 사용하여 Python을 사용하여 이에 대한 코드를 작성했습니다.
데몬이 항상 실행되고 있는지 확인하고 싶습니다. 즉, 충돌 후 다시 시작하고 시스템 부팅 시 시작합니다(중요하게 사용자가 로그인하기 전에 - 이 Pi는 헤드리스로 실행됩니다). 깜박이는 LED 표시등이 작동 중임을 알려주지만 이상적이지는 않습니다.
이를 달성하기 위해 MONIT를 사용하는 방법에 대해 읽었지만 몇 가지 문제가 발생했습니다. 지금까지 나의 시도는 주로 이 솔루션을 중심으로 진행되었습니다.
https://stackoverflow.com/questions/23454344/use-monit-monitor-a-python-program
이것은 /home/pi/UPSalarm/UPSalarm.bash라는 bash 래퍼 파일입니다.
#!/bin/bash
PIDFILE=/var/run/UPSalarm.pid
case $1 in
start)
#source /home
#Launch script
sudo python /home/pi/UPSAlarm/UPSalarm.py 2>/dev/null &
# store PID value
echo $! > ${PIDFILE}
;;
stop)
kill `cat ${PIDFILE}`
# Proccess killed, now remove PID
rm ${PIDFILE}
;;
*)
echo "usage: scraper {start|stop}" ;;
esac
exit 0`
이것이 나의 모니터링 규칙이다
check process UPSalarm with pidfile /var/run/UPSalarm.pid
start = "/home/pi/UPSalarm/UPSalarm start"
stop = "/home/pi/UPSalarm/UPSalarm stop"
두 가지 문제가 있습니다. 첫째, UPSalarm.pid에 잘못된 PID 번호가 있습니다. sudo에 대한 PID 번호를 얻을 수 있는지 알고 싶습니다. 이것이 바로 제가 이 질문을 여기에 게시하는 이유입니다. GPIO 포트에 액세스해야 하기 때문에 sudo가 필요합니다. 둘째, 작동하지 않습니다. 셋째, source
bash 파일에 무엇이 있는지 잘 모르겠습니다 .
나는 monit이 좋은 문서를 가지고 있다는 것을 알고 있지만 Python의 실제 예제가 정말 도움이 될 것입니다. 나는 며칠 동안 갇혀 있었습니다.
다음 웹사이트도 도움이 됩니다. https://www.the-hawkes.de/monitor-your-raspberrypi-with-monit.html(모니터 설정용) https://mmonit.com/monit/documentation/monit.html
이 두 가지 질문은 관련되어 있지만 내 문제를 해결하지 못합니다. https://raspberrypi.stackexchange.com/questions/9938/monitoring-a-python-script-running-in-a-screen-session-with-monit Python 스크립트가 종료되거나 종료된 경우 자동으로 다시 시작하는 방법
답변1
이 쉘 래퍼는 init 스크립트처럼 보이지만 분명히 그렇지 않습니다(그래서 sudo
거기에서 사용해야 합니다. init에 의해 실행되는 스크립트에는 이것이 필요하지 않습니다).
이는 매우 서투른 접근 방식처럼 보입니다. 쉘 래퍼는 Python 프로그램 자체가 더 나은 기능을 제공할 수 없는 목적을 제공하지 않습니다. 이를 제거하십시오. 특히 init 스크립트를 원한다면 최소한의 스크립트를 작성하십시오. 그러나 데몬을 제어하는 로직을 init 스크립트에서 데몬( UPSalarm.py
) 자체로 옮기는 것이 좋습니다.
하나의 인스턴스만 필요하므로 프로세스에서 사용할 pid 파일을 정의합니다. 실행하면 UPSalarm.py start
파일이 존재하는지 확인합니다. 존재하지 않으면 파일에 자신의 pid를 쓰고 계속하십시오. 존재하는 경우 pid를 가져온 다음 OS를 확인하여 해당 pid를 가진 프로세스가 있는지, 그렇다면 프로세스 이름은 무엇인지 확인합니다. 이는 UPSalarm.py
이미 실행 중인지 아닌지를 증명합니다. 그렇다면 "실행 중" 메시지와 함께 종료됩니다.
을 실행할 때 UPSalarm.py stop
유사한 시퀀스가 포함됩니다. pid 파일이 있는지 확인하고, pid가 명명된 프로세스에 대해 유효한지 확인하고 UPSalarm.py
중지 신호를 발행합니다 SIGINT
. 아마도 를 사용하여 UPSalarm.py
신호 처리기를 구현해야 할 것 SIGINT
입니다 . pid 파일을 종료하기 전에 제거되었습니다.
저는 Python 프로그래머도 아니고 프로그래밍 웹사이트도 아닙니다.스택 오버플로), 그러나 나는 이것이 Python으로 쉽게 가능하다고 약속합니다.
- 현재 프로세스의 pid를 얻으려면,사용
os.getpid()
. - pid를 프로세스 이름에 매핑하려면
/proc/[pid]/cmdline
문자열 검색UPSalarm.py
(또는 더 나은 방법은 호출의 프로세스 이름)을 읽고 수행하십시오sys.argv[0]
.여기). - 신호 처리를 위해 시작여기그리고여기.
- 다른 프로세스에 신호를 보내려면사용
os.kill()
.
그러면 이 데몬을 처리하도록 구성하기가 쉬워집니다 monit
. 그런 다음 (또는 자신의 스크립트)를 사용하여 cron
가끔씩(예: 5-10분마다) 호출하도록 선택할 수도 있습니다 .UPSalarm.py start