라즈베리파이

_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