부팅 시 자동실행 – RasberryPi3

라즈베리파이에서 부팅시 자동실행되도록 설정해줄 일이 있었다.
우분투의 경우 시작프로그램에 등록하는 기능을 GUI로 제공해주어 간단하게 할 수 있으나
라즈베리파이는 그렇지 않다.

1. profile.d

첫째로 /etc/profile.d/를 수정하는 법이 있다.
profile.d 안의 내용물들은 부팅 시 자동으로 실행되는데, 그 중에서도 bash_completion.sh 안에 실행할 스크립트를 내장하면 자동실행이 된다.

문제는 언제 자동실행되냐는건데…
쉘에 연결될때마다 자동실행된다.
이 말뜻은 재부팅하고 ssh로 쉘에 붙으면 스크립트가 두 번 실행된다는 의미이다.
ssh로 쉘 붙을때마다 계속 새로 실행된다.

이런 설정은 환경변수 등을 초기화해줄 때 좋다.
다만 내 경우는 백그라운드에 프로그램을 돌리는 경우기 때문에 이런 설정은 맞지 않는다.

참고로, /etc/profile.d는 전역 설정이다.
특정 사용자가 쉘에 접속할 때마다 실행하고싶으면 ~/.profile을 건드리면 된다.

2. update-rc.d

둘째로 update-rc.d를 설정하는 방법이 있다.
/etc/init.d에 스크립트를 내장하고, update-rc.d 커맨드를 통해 스크립트를 자동실행하도록 만들면 된다.

원리는 간단하다.
스크립트에 정의된 내용을 토대로 update-rc.d 프로그램이 /etc/rc?.d에 심볼릭 링크를 만든다.
그 후, run-level에 맞게 스크립트가 수행되는 것이다.
물론 정의하기에 따라 run-level이 해당 수준으로 바뀌거나, 해당 수준에서 벗어날 때 실행되도록 만들 수도 있다.

test 스크립트를 /etc/init.d에 내장시켰다
  1 #!/bin/bash
  2 
  3 ### BEGIN INIT INFO
  4 # Provides:          bluetooth_server
  5 # Required-Start:    $local_fs $remote_fs $network $syslog $named
  6 # Required-Stop:     $local_fs $remote_fs $network $syslog $named
  7 # Default-Start:     2 3 4 5
  8 # Default-Stop:      0 1 6
  9 # Short-Description: Start/stop bluetooth_server
 10 # Description:       starts my_service using start-stop-daemon
 11 ### END INIT INFO
 12 
 13 case $1 in
 14     start)
 15         cd /home/pi/Desktop/HILAB_SmartDairy/test_bluetooth
 16         ./server &
 17         echo "Starting bluetooth server"
 18         ;;
 19     stop)
 20         pkill server
 21         echo "Bluetooth server stopped"
 22         ;;
 23     *)
 24         echo "Usage: /etc/init.d/test {start|stop}"
 25         exit 1
 26         ;;
 27 esac
 28 exit 0

update-rc.d의 man페이지를 보면 3-11라인처럼 LSB 헤더를 넣어줘야한단다.
이 헤더를 기반으로 run-level을 구분하는 모양
근데 안넣어줘도 잘 되긴 하는데, 커널마다 강제성 여부는 다르긴 한 것 같다.

참고로 이런 스크립트를 만들어주면 sudo /etc/init.d/test {start|stop} 형태로 스크립트를 제어할 수 있다.
요긴하게 써먹을 수 있겠다.

자동실행 커맨드는 update-rc.d test defaults인데, 커맨드야 검색해서 찾으면 더 상세히 잘나온다.

그 결과 다음과 같이 스크립트에서 정의한 run-level에(이 경우, 모든 run-level에) 스크립트가 링크된다.

굿

그 외에도 rc.local 등 다른 방법들이 있는 것 같지만, 현 라즈베리파이 환경에서는 지원하지 않는다.

댓글 남기기