라즈베리파이에서 부팅시 자동실행되도록 설정해줄 일이 있었다.
우분투의 경우 시작프로그램에 등록하는 기능을 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이 해당 수준으로 바뀌거나, 해당 수준에서 벗어날 때 실행되도록 만들 수도 있다.
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 등 다른 방법들이 있는 것 같지만, 현 라즈베리파이 환경에서는 지원하지 않는다.