자동 부팅 시 스크립트 실행 설정법 (rc.local vs systemd)

1. 자동 실행 설정이 필요한 이유

라즈베리파이나 리눅스 서버에서 특정 스크립트를 부팅할 때 자동 실행되도록 설정하면,
시스템이 재부팅되더라도 자동으로 서비스가 시작되어 관리가 훨씬 편해집니다.

예를 들어 다음과 같은 상황에서 유용합니다.

  • IoT 센서 데이터를 자동으로 수집
  • 웹 서버 또는 MQTT 브로커 자동 시작
  • GPIO 제어나 LED 점등 스크립트 실행
  • 백그라운드 모니터링 프로그램 구동

자동 실행 설정에는 rc.local 방식systemd 서비스 방식 두 가지가 대표적입니다.

2. rc.local 방식의 개념과 설정법

rc.local은 전통적인 리눅스 초기화 스크립트 방식입니다.
부팅 과정의 마지막 단계에서 /etc/rc.local 파일에 작성된 명령을 실행합니다.

설정 방법

  1. rc.local 파일 열기 sudo nano /etc/rc.local
  2. exit 0 바로 위에 실행할 명령 추가 python3 /home/pi/startup.py & exit 0 여기서 &는 백그라운드 실행을 의미합니다.
  3. 실행 권한 부여 sudo chmod +x /etc/rc.local
  4. 재부팅 테스트 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.localsystemd
설정 난이도간단함약간 복잡함
지원 버전구형 리눅스 중심최신 리눅스 표준
에러 로깅불편함journalctl로 확인 가능
재시작 자동화불가능Restart=always로 가능
의존성 제어제한적네트워크 등 서비스 의존성 설정 가능
추천도초보자용 임시 스크립트상시 실행 서비스용 추천

요약하자면, 단순히 한두 줄짜리 스크립트를 실행하려면 rc.local이 편하지만
지속적으로 실행되어야 하는 서비스는 systemd를 사용하는 것이 훨씬 안정적입니다.

6. 자주 발생하는 오류와 해결법

  1. 경로 오류:
    스크립트의 절대 경로를 지정해야 합니다.
    /home/pi/startup.py 처럼 전체 경로를 입력하세요.
  2. 실행 권한 문제: chmod +x /home/pi/startup.py
  3. 네트워크 지연 문제:
    네트워크가 연결된 뒤 실행해야 하는 경우 After=network-online.target 을 추가하면 해결됩니다.
  4. 환경 변수 인식 문제:
    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

이 원칙만 기억하면 어떤 프로젝트에서도 깔끔하게 자동 실행을 구현할 수 있습니다.

Similar Posts

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다