라즈베리파이
_cron과 daemon 개념잡기
별메아리
2023. 3. 8. 14:39
728x90
cron (크론) 개념잡기
cron은 주기적인 실행이 필요할 때 사용합니다. 예를 들어 매일 자정에 데이터를 백업하고 싶다거나 아침 7시가 되면 led를 작동시키고 싶다면 cron을 사용하면 됩니다.
등록된 크론확인
$ crontab -l
no crontab for pi
크론 실습파일
# -*- encoding: utf-8 -*-
import RPi.GPIO as GPIO
import time
GPIO.cleanup() #한글
LED = 8
GPIO.setmode(GPIO.BOARD)
GPIO.setup(LED, GPIO.OUT, initial=GPIO.LOW)
try:
num = 0
while(True):
time.sleep(1)
GPIO.output(LED, GPIO.HIGH)
time.sleep(1)
GPIO.output(LED, GPIO.LOW)
num = num + 1
if(num == 5):
GPIO.cleanup()
break
except KeyboardInterrupt:
GPIO.cleanup()
led.py 프로그램을 실행합니다.
$ python led.py
LED가 깜박거리고 있으면 CTRL+c를 해서 프로그램 작동을 멈춥니다.
led.py 파일 cron에 등록합니다.
crontab -e
crontab을 열고 가장 아래줄에 다음과 같이 적어줍니다.
*****sudo python /home/pi/webapps/ch06/cron/led.py
# 여기서 pi는 사용자폴더명
사용하는것을 그만 두고 싶다면
$ crontab -e
여기에 들어가서 전에 적엇던 코드를 지우면됩니다.
그리고 crontab를 등록할 때 python 코드에 한글이 있으면 문자 encoding을 해줘야 합니다. 그렇기 때문에 코드에 한글을 적게 된다면 문자 인코딩을 해야 합니다.
소스 코드 가장 상단에 다음과 같은 코드를 추가해줍니다.
# -*- encoding:utf-8 -*-
daemon(데몬) 개념잡기
크론이 주기를 가지고 실행되는 것이라면 데몬은 계속 실행되는 것입니다. LED를 라즈베리 파이를 재부팅했을 때부터 종료 시 까지 자동으로 실행함과 동시에 계속적인 동작을 원한다면 데몬으로 등록합니다.
데몬을 등록전 앞에서 했던 crontab에 등록된 led관련코드를 삭제해줍니다.
다음과 같이 코드를 작성합니다.
#! /usr/bin/env python
import RPi.GPIO as GPIO
import time
GPIO.cleanup()
LED = 8
GPIO.setmode(GPIO.BOARD)
GPIO.setup(LED, GPIO.OUT, initial=GPIO.LOW)
try:
num = 0
while(True):
time.sleep(1)
GPIO.output(LED, GPIO.HIGH)
time.sleep(1)
GPIO.output(LED, GPIO.LOW)
num = num + 1
if(num == 5):
GPIO.cleanup()
break
except KeyboardInterrupt:
GPIO.cleanup()
가장 맨 위에 #! /usr/bin/env python를 꼭 첨부해줘야합니다.
rc.local파일을 수정합니다.
$ sudo nano /etc/rc.local
# Print the IP address
_IP=$(hostname - I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
python /home/pi/webapps/ch06/daemon/led2.py & #이 사이에 실행할 구문을 넣고 &을 마지막에 추가
exit
led2.py에 실행권한을 줍니다. 소유자, 소유그룹, 모든 유저에게 모든 권한을 줍니다.
$ chmod 777 led2.py
flask서버를 재부팅시에 항상 자동 실행하게 설정할 수 있습니다.
728x90