자동 부팅 시 스크립트 실행 설정법 (rc.local vs systemd)
1. 자동 실행 설정이 필요한 이유
라즈베리파이나 리눅스 서버에서 특정 스크립트를 부팅할 때 자동 실행되도록 설정하면,
시스템이 재부팅되더라도 자동으로 서비스가 시작되어 관리가 훨씬 편해집니다.
예를 들어 다음과 같은 상황에서 유용합니다.
- IoT 센서 데이터를 자동으로 수집
- 웹 서버 또는 MQTT 브로커 자동 시작
- GPIO 제어나 LED 점등 스크립트 실행
- 백그라운드 모니터링 프로그램 구동
자동 실행 설정에는 rc.local 방식과 systemd 서비스 방식 두 가지가 대표적입니다.
2. rc.local 방식의 개념과 설정법
rc.local은 전통적인 리눅스 초기화 스크립트 방식입니다.
부팅 과정의 마지막 단계에서 /etc/rc.local 파일에 작성된 명령을 실행합니다.
설정 방법
- rc.local 파일 열기
sudo nano /etc/rc.local exit 0바로 위에 실행할 명령 추가python3 /home/pi/startup.py & exit 0여기서&는 백그라운드 실행을 의미합니다.- 실행 권한 부여
sudo chmod +x /etc/rc.local - 재부팅 테스트
sudo reboot
주의할 점
- rc.local은 Ubuntu 20.04 이후 기본 비활성화 상태입니다.
systemd환경에서는 rc.local이 자동 실행되지 않을 수 있습니다.
이 경우 systemd를 이용한 방법이 더 안정적입니다.
3. systemd 서비스 방식의 개념
systemd는 현재 대부분의 리눅스 배포판에서 사용되는 표준 부팅 관리 시스템입니다.
모든 서비스와 프로세스의 시작을 unit 파일로 제어합니다.
즉, systemd를 이용하면 스크립트를 서비스처럼 자동 시작, 중지, 재시작할 수 있습니다.
또한 로그 관리와 상태 모니터링이 가능해 rc.local보다 현대적인 방식입니다.
4. systemd로 스크립트 자동 실행 설정하기
1단계: 서비스 파일 생성
sudo nano /etc/systemd/system/mystartup.service
2단계: 다음 내용 입력
[Unit]
Description=My Startup Script
After=network.target
[Service]
ExecStart=/usr/bin/python3 /home/pi/startup.py
WorkingDirectory=/home/pi
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
3단계: 서비스 등록 및 활성화
sudo systemctl daemon-reload
sudo systemctl enable mystartup.service
sudo systemctl start mystartup.service
4단계: 실행 상태 확인
sudo systemctl status mystartup.service
로그를 확인하고 싶다면 아래 명령을 사용합니다.
journalctl -u mystartup.service -f
이제 시스템이 부팅될 때 자동으로 해당 스크립트가 실행됩니다.
5. rc.local과 systemd의 차이점 비교
| 구분 | rc.local | systemd |
|---|---|---|
| 설정 난이도 | 간단함 | 약간 복잡함 |
| 지원 버전 | 구형 리눅스 중심 | 최신 리눅스 표준 |
| 에러 로깅 | 불편함 | journalctl로 확인 가능 |
| 재시작 자동화 | 불가능 | Restart=always로 가능 |
| 의존성 제어 | 제한적 | 네트워크 등 서비스 의존성 설정 가능 |
| 추천도 | 초보자용 임시 스크립트 | 상시 실행 서비스용 추천 |
요약하자면, 단순히 한두 줄짜리 스크립트를 실행하려면 rc.local이 편하지만
지속적으로 실행되어야 하는 서비스는 systemd를 사용하는 것이 훨씬 안정적입니다.
6. 자주 발생하는 오류와 해결법
- 경로 오류:
스크립트의 절대 경로를 지정해야 합니다./home/pi/startup.py처럼 전체 경로를 입력하세요. - 실행 권한 문제:
chmod +x /home/pi/startup.py - 네트워크 지연 문제:
네트워크가 연결된 뒤 실행해야 하는 경우After=network-online.target을 추가하면 해결됩니다. - 환경 변수 인식 문제:
systemd는 기본적으로 로그인 셸 환경 변수를 사용하지 않습니다.
필요하다면Environment=옵션을 추가하세요.
7. 실전 예시: 부팅 시 Python 스크립트 실행
예를 들어 온습도 센서 데이터를 수집하는 sensor.py를 자동 실행하려면 다음과 같이 설정합니다.
서비스 파일
sudo nano /etc/systemd/system/sensor.service
내용
[Unit]
Description=Sensor Data Logger
After=network.target
[Service]
ExecStart=/usr/bin/python3 /home/pi/sensor.py
WorkingDirectory=/home/pi
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
등록 후 아래 명령으로 적용합니다.
sudo systemctl daemon-reload
sudo systemctl enable sensor.service
sudo systemctl start sensor.service
이제 라즈베리파이가 켜질 때마다 센서 스크립트가 자동으로 실행됩니다.
8. 마무리 및 추천 방식
라즈베리파이에서 자동 실행을 설정하는 방법은 두 가지가 있지만,
현재는 systemd 방식이 표준이자 권장 방식입니다.
단순한 테스트용이면 rc.local도 충분하지만,
장시간 실행되는 프로그램이나 서버용 스크립트라면 반드시 systemd로 설정하세요.
이 방식은 자동 재시작, 로그 추적, 서비스 의존성 제어 등 다양한 기능을 제공하므로
안정적이고 확장 가능한 라즈베리파이 운영 환경을 구축할 수 있습니다.
결론적으로,
- 간단한 자동 실행 → rc.local
- 지속 서비스나 IoT 서버용 → systemd
이 원칙만 기억하면 어떤 프로젝트에서도 깔끔하게 자동 실행을 구현할 수 있습니다.