안녕하세요! 이번시간에는 라즈베리파이 부팅시 프로그램(스크립트)를 자동으로 실행되도록 설정하는 5가지 방법에 대해 설명드리겠습니다.
우선 왜 자동으로 프로그램이 실행되도록 설정해야 하는지를 알아야 겠죠?
왜 프로그램이 자동실행 될 필요가 있을까?
여러분들이 라즈베리파이로 뭔가 재밌는 프로젝트를 만들었는데 매번 전원을 껐다가 다시 켜면 프로그램을 구동시키기 위해 ssh로 접속해서 프로그램을 실행한다고 생각해보세요. 굉장히 짜증나는 일이겠죠? 아래사진의 시계를 예로 들어 보겠습니다. 아래 사진은 라즈베리파이제로를 사용해서 만든 LED시계인데요.
LED시계
위와 같이 시계를 구동하기 위해서 아래와 같이 스크립트 실행문을 입력해 주어야 하는데요.
만약 제작한 시계를 전원을 껐다 켤때마다 ssh로 외부에서 컴퓨터나 노트북을 사용해서 라즈베리파이로 접속해서 원하는 프로그램이나 스크립트를 매번 다시 실행해야 한다면 짜증나겠죠? 라즈베리파이는 아두이노와 다르게 여러 목적으로 활용될 수 있는 범용 제품이기 때문에 매번 전원이 새로 인가될 때마다 지정된 프로그램을 실행하지 않습니다. 따라서 우리가 특정 목적으로 라즈베리파이가 동작하도록 프로젝트를 만들었다면 그 목적에 맞는 프로그램을 부팅시 실행될 수 있게 설정할 필요가 있는 것입니다.
이와 같은 목적을 위해 라즈베리파이 부팅시 자동으로 프로그램이 실행되도록 하는 방법은 5가지가 있는데요. 하나씩 설명드리겠습니다.
1번째 방법: rc.local 파일을 수정하는 방법
rc.local 파일은 라즈베리파이가 부팅될 때 실행될 스크립트를 지정할 수 있는 파일입니다. 따라서 이 파일에 부팅시 실행될 스크립트의 경로를 설정해 놓으면 라즈베리파이가 부팅할 때 이 스크립트를 자동으로 실행하게 됩니다.
rc.local 파일 수정하기
rc.local 파일은 /etc/rc.local 의 경로에 있으므로 여러분이 좋아하는 에디터를 사용해서 이 파일을 우선 열어야 합니다. 이때 유의하실 점이 파일을 편집할 때는 반드시 루트계정으로 해야 한다는 점입니다.
sudo vi /etc/rc.local
저는 위와 같이 vi에디터를 사용했는데요. 여러분은 여러분이 사용하기 편한 에디터(nano, gedit 등)을 활용해서 편집하시면 됩니다.
**참고로 리눅스에서 sudo 명령어는 root계정으로 명령을 실행한다는 의미입니다.**
실행될 스크립트 추가
위와 같이 exit 0 윗 줄에 자동으로 실행될 명령어를 지정해 주면 되는데요. 한가지 유의할 점이 있습니다. 자동 실행될 프로그램이나 스크립트가 종료되지 않고 계속 반복해서 실행되는 프로그램이라면 아래처럼 마지막에 "&"(앰퍼샌드) 를 반드시 입력해 주어야 합니다.
sudo python /home/pi/sample.py &
그렇지 않으면 라즈베리파이는 부팅과정에서 이 프로세스에 막혀 다음 부팅과정을 진행하지 못하게 됩니다. "&"(앰퍼샌드)를 입력해 주면 하부 프로세스에서 이 프로그램을 실행하고 주 프로세서는 남은 부팅과정을 완료하게 됩니다.
실행될 파일을 추가했다면 제대로 동작하는지 확인하기 위해 라즈베리파이를 재 부팅해 봅시다. 라즈베리파이를 재부팅하기 위해서는
sudo reboot
위와 같이 명령어를 입력하면 됩니다.
부팅이 될 때까지 수십초 정도 기다리면 위에서 rc.local 파일에 입력했던 명령이 실행되는 것을 확인할 수 있습니다.
주의사항
이 방법을 사용할 때에는 몇가지 주의사항에 신경을 쓰셔야 하는데요. 실행될 파일은 상대경로가 아닌 절대경로를 지정해야 합니다. 예를 들자면 myscript.py대신에 /home/pi/myscript.py 와 같은 식으로 말이죠. 그리고 실행될 코드가 에러가 없는지 여러번 확인 후에 자동실행되도록 설정하는 것이 좋습니다. 왜냐하면 코드에 에러가 있으면 부팅과정에서 더 진행되지 못하고 막혀버릴 가능성이 있기 때문입니다.
2번째방법: .bashrc
두번째 방법은 .bashrc파일을 수정하는 것입니다. 이 방법은 라즈베리파이가 부팅될때 마다 실행되고 또 새로운 터미널창이 열리거나 ssh연결이 들어왔을 때에도 실행됩니다. 지정하는 방법은 'home/pi/.bashrc'파일을 수정하면 됩니다. 실행되는 프로그램은 'ctrl-c'로 중지시키는 것도 가능합니다.
그럼 파일을 수정하기 위해 아래와 같이 자신이 원하는 에디터로 파일을 열어줍니다. 저는 vim 에디터로 파일을 열었습니다.
그리고 나서 마지막 줄에 실행하고자 하는 파일과 명령어를 입력해 줍니다.
저는 Running at boot라는 메시지가 먼저 뜨고 그다음 시계 프로그램을 실행하도록 입력했습니다.
그다음 저장하고 다시 파이를 재 부팅해보면 파이가 부팅하면서 내가 지정한 프로그램을 실행하는 것을 확인 할 수 있습니다.
ssh로 파이에 다시 접속해 보면 위와 같이 Running at boot라는 메시지가 뜨는 것을 확인 할 수 있습니다.
sudo reboot
3번째방법: init.d 디렉토리 사용
세번째 방법은 여러분이 원하는 프로그램(스크립트)을 /etc/init.d 디렉토리에 넣는 것입니다. 이 디렉토리는 부팅이 시작될 때 실행될 스크립트를 모아놓는 폴더인데요. 라즈베리파이를 shutdown으로 끄거나 reboot할 때도 이 디렉토리 내의 프로그램들이 실행됩니다. 따라서 실행하고 싶은 파일(스크립트)를 이 디렉토리로 옮겨야 겠죠?
아래와 같이 리눅스의 복사 명령어를 사용하면 됩니다.
그리고 나서 옮김 디렉토리로 들어가 보면 방금 옮긴 파일을 찾을 수 있습니다.
그런데 이 옮긴 파일이 자동으로 부팅시 실행이 되려면 Linux Standard Base(LSB)라고 불리는 정해진 문법을 스크립트의 앞에 정의해야만 합니다. 따라서 옮긴 파일을 열어 아래와 같이 구문을 추가해 줍니다.
LSB
init.d 디렉토리에 있는 파일은 이 LSB 구문을 통해 부팅시 어떤 파일이 먼저 실행될지와 부팅과정을 빠르게 하기 위해 병렬로 프로그램을 실행할지 여부 등을 정하게 됩니다. 자세한 내용은 이 가이드를 참고하시기 바랍니다.
한가지 주의할 점은 옮긴 파일에 실행권한을 부여해야 한다는 것입니다. 따라서 아래와 같이 실행권한을 주는 명령어를 통해 실행권한을 부여 합니다.
마지막으로 자동실행파일을 등록하기 위해서는 아래와 같이 init.d 자동 업데이트 명령어를 내려 줍니다.
라즈베리파이를 재 부팅시켜보면 위에서 지정한 파일이 실행되는 것을 확인 할 수 있습니다.
4번째방법: SYSTEMD 사용
systemd 파일을 사용해서도 부팅할 때 실행될 프로그램을 지정할 수 있는데요. systemd파일은 리눅스시스템이 부팅될 때 어떤 프로그램이 실행될지를 지정할 수 있는 파일입니다.
그 다음 파일을 저장해 줍니다. 우리는 'clock'서비스를 만들었는데요. 이 서비스는 다중유저 환경이 가능해졌을때 실행되도록 요청하는 것입니다 'ExecStart' 부분에 입력하는 명령어는 실행되길 원하는 명령어를 넣으면 됩니다 'Type'에 idle 이라고 지정을 하면 서비스가 다른 자원들이 로드되었을 때 프로그램이 실행되는 것을 보장해 줍니다. 여기서 경로는 파이썬이 실행될 절대경로여야 하고 실행될 프로그램도 마찬가지로 절대경로로 입력해야 합니다.
위에서 만든 명령어는 파일 권한이 644가 되어야 하기 때문에 아래와 같은 명령어로 파일의 권한을 바꿔 줍니다.
sudo chmod 644/lib/systemd/system/sample.service
2단계-systemd 설정하기
이제 유닛파일을 만들었으므로 systemd가 이 유닛파일을 부팅동안에 시작시키도록 명령을 내려줍니다.
이제 다시 라즈베리파이를 재부팅 시켜보면 지정된 프로그램이 실행되는 것을 확인 할 수 있습니다.
sudo reboot
5번째방법: Crontab 사용
crontab은 리눅스에서 정해진 시간에 지정한 명령을 수행하는데 사용되는 데몬(일종의 백그라운드 프로그램)인 cron에서 사용하는 테이블입니다. crontab은 단순히 부팅과정에서 프로그램을 실행되도록 하는 것 외에도 '예를들어 매주 목요일 12시에 특정프로그램을 실행'하도록 지정할 수도 있습니다.
라즈베리파이에서 크론탭을 사용하려면 아래와 같은 단계를 따르면 됩니다.
1단계- 원하는 위치에 파일을 만듭니다.
저는 /home/pi/py_test.py 라는 파일을 만들어서 아래와 같이 간단한 문장을 출력하는 프로그램을 입력했습니다.
2단계- crontab을 엽니다.
sudo crontab -e
3단계- 부팅시 실행될 명령어를 @reboot 와 함께 맨 아래줄에 추가합니다.
@reboot sudo python3 /home/pi/py_test.py
이제 라즈베리파이를 다시 재부팅하면 위에서 지정한 파일이 실행되는 것을 확인 하실 수 있습니다.
sudo reboot
제언
여러분이 실행하고 싶으신 프로그램이 라즈베리파이의 부팅에서 순서가 중요하지 않은 프로그램이라면 위 5가지 방법중 어떤 방법을 사용하셔도 좋겠죠? 하지만 때로는 순서가 매우 중요한 경우가 있습니다. 예를 들어 네트워크 연결이 설정되어야만 작동이 가능한 프로그램이라던지, 아니면 특정 디렉토리가 마운트된 다음에 실행되어야 한다던지.... 등등.... 이럴 때는 프로그램이 실행되는 순서를 지정할 수 있는 init.d나 systemd의 방법을 사용하셔야 합니다. 왜냐하면 두 방법은 부팅과정에서 어떤 스크립트를 먼저 실행할지를 지정할 수 있기 때문입니다. 아무쪼록 이 포스팅이 누군가에게는 도움이 되셨기를 바랍니다. 그럼 이만^^
WinLux = Windows + Linux 합성어.
윈도우, 리눅스, 서버, Oracle 등 정보 수록. - 개인적으로 서버관련(서버솔루션, 서버장비, 스팸장비, 네트웍장비, 방화벽, 웹방화벽, DB암호화, Was모니터링솔루션 등)업무를 진행하고 있습니다. 업무중 궁금한 사항이나 관련사항에 대해 해결방법을 공유하고자 합니다.