본문으로 바로가기
반응형

LED 껐다 켰다를 했으면 그것을 했다.가 끝이아니고 무엇까지 연결할줄알아야한다.

프로세스 : 실행중인 프로그램

 

 

 

Process(프로세스)

프로그램은 보조 기억장치(HDD, SSD)에 존재하며 실행되기를 기다리는 명령어(코드)와 정적인 데이터의 묶음이다.

이 프로그램의 명령어와 정적 데이터가 메모리에 적재되면 생명이 있는 프로세스가 된다.

즉, 프로세스란 실행 중인 프로그램이다.

 

간단한 LED 동작 Flask 파일을 만들고 실행해보자.

webapps

    -ch06

        -process

             -process.py

 from flask import Flask, request

 import RPi.GPIO as GPIO

 app = Flask(__name__)

 LED = 21
 GPIO.setmode(GPIO.BCM)
 GPIO.setup(LED, GPIO.OUT, initial=GPIO.LOW)

 @app.route("/led/<state>")
 def led(state):
     if(state == "on"):
         GPIO.output(LED, GPIO.LOW)
         return "LED ON"
     elif(state == "off"):
         GPIO.output(LED, GPIO.HIGH)
         return "LED OFF"
     else:
         return "error"

 if __name__ == "__main__":
     app.run(host="0.0.0.0")

 

$ ps -f 를 실행해서 포그라운드 프로세스를 확인한다. (-f는 자세히 보기 옵션이다.)

ps -f를 통해 포그라운드로 실행되는 프로세스를 자세히 확인할 수 있습니다. 그런데 우리가 실행중인 process.py 파일은 보이지 않는다. 이것은 우리가 실행중인 파일은 백그라운드로 실행되고 있기 때문이다.

 

터미널 하나를 새로 열어서 python process.py  를 실행시켜둔다.

다른 한 터미널에는 $ ps -ef | grep process.py  를 실행시켜준다.

파이썬 명령어실행(좌)                      ps -ef 실행 (우)

 

 

 grep 명령어는 파이프라인 명령어인데, 파일에서 특정한 패턴(문자열)을 찾는 명령어이다. 두개의 명령어를 연결하기 위해서는 | 를 써야한다.(or 연산자)

 process.py 파일은 1429라는 PID 값을 가지고 있다.(다른 장비로는 다르게 뜰 수도 있다) 

 PID는 프로세스 아이디 라는 것인데, 우리 주민등록번호와 같이 해당 프로세스의 고유한 ID를 의미하며, 중복되지 않는 유일한 값이다. 해당 PID를 이용하면 해당 프로세스를 끌 수도 있다.

kill 1429를 입력하면 종료된다

 

$ netstat -nlpt

명령어를 이용해서 PID를 알수도 있다.

로컬호스트가 5000 이므로 PID를 알 수 있다. kill 명령어를 입력하면 프로세스가 종료된다

 

 

cron(크론)

 cron은 주기적인 실행이 필요할때 사용한다. 일의 스케줄을 설정하는 것이라고 생각하면 된다.(아침 7시에 led를 작동시키고 싶다면 cron을 사용하면 된다)

등록된 cron이 없으므로 cron을 등록해서 led를 작동시켜보자.

1초마다 깜빡꺼리는 프로그램 작성

webapps

   - ch06

      - cron

          - led.py

 import RPi.GPIO as GPIO
 import time

 GPIO.cleanup()

 LED = 21
 GPIO.setmode(GPIO.BCM)
 GPIO.setup(LED, GPIO.OUT, initial = GPIO.LOW)

 try:
     num=0
     while(True):
         time.sleep(1)
         GPIO.output(LED, GPIO.LOW)
         time.sleep(1)
         GPIO.output(LED, GPIO.HIGH)
         num = num + 1
         if(num == 5):
             GPIO.cleanup()
             break
 except KeyboardInterrupt:
     GPIO.cleanup()

위 코드를 실행시켜주면 LED가 5초 동안 깜빡이게 된다

 4번째 줄에 cleanup을 적어준 이유는 21번 채널을 cleanup()하지 않고 해당 프로그램을 다시 실행하게 되면 GPIO가 사용중이라는 error메시지를 보게되기때문에 GPIO가 사용중이든 사용중이지 않아도 무조건 GPIO.cleanup() 함수를 실행시켜서 GPIO를 종료시켜준다.

 

 

led.py 파일을 cron에 등록해보자.

crontab -e

2를 누르고 엔터

 

 

$ crontab -e 를 다시 실행하면 편집기창으로 이동한다.

이때 맨 밑에가서 다음 명령어를 입력한다.

* * * * * sudo python /home/pi/webapps/ch06/cron/led.py

 

crontab 으로 접속된 화면

 

 

sudo vi /var/spool/cron/crontabs/pi

를 입력하면 vi편집기로 들어갈 수 있다.

 

입력한 코드는 1분마다 해당 파일을 실행하라는 코드이다. 등록해두고 저장하고 빠져나오면 LED가 1분마다 5초씩 깜빡이는 것을 볼 수 있다.

 

 

man 명령어

리눅스에는 man 명령어를 사용하여 각종 명령어, 프로그램의 사용법(메뉴얼)을 확인할 수 있다. man 명령어로 위에서 * * * * *가 무슨 의미인지 찾아볼수도 있다.

 

$ man ls

vi 편집기 명령어도 사용가능. (j, k로 방향키 위아래를 할 수 있다.)

/단어   단어를 입력하면 그 단어를 찾는다.

빠져나오려면 그냥 q를 누르면 빠져나올 수 있다.

 

$ man cron

 

 

$ man crontab

 

crontab 페이지에서 맨 밑을보면 이름은 같은데 다른 페이지가 존재하는 것도 발견할 수 있다. 5페이지로 가보자.

 

* * * * * 의 사용법이 나와있다.

 

 

 

 

 

daemon(데몬)

 크론이 주기를 가지고 실행되는 것이라면 데몬은 계속 실행되는 것이다. LED를 라즈베리파이가 재부팅했을 때부터 종료 시까지 자동으로 실행함과 동시에 계속적인 동작을 원한다면 데몬으로 등록한다.

 

예제를 실행하기 전에 앞서, 방금 crontab -e 에서 쳤던 * * * * * 코드를 주석처리하고 시작하자.

 

 

$ sudo vi /etc/rc.local

에서 해당 코드를 추가시켜준다.

 

$ chmod 777 led2.py

를 입력한다. 이 코드는 led2.py 파일에 실행권한을 소유자, 소유그룹, 모든 유저에게 모든 권한을 준다.

 

 이제 재부팅해보면 LED가 5초 동안 깜빡이고 있는 것을 확인할 수 있다.

 다시 PuTTY를 부팅해보면 LED가 깜빡거리는 것을 확인할 수 있다.

 

반응형