Published Book on Amazon
All of IOT
Starting with the Latest Raspberry Pi from Beginner to Advanced – Volume 1 |
|
All of IOT
Starting with the Latest Raspberry Pi from Beginner to Advanced – Volume 2 |
출판된 한글판 도서
최신 라즈베리파이(Raspberry Pi)로 시작하는 사
물인터넷(IOT)의 모든 것 – 초보에서 고급까지 (상) |
|
최신 라즈베리파이(Raspberry Pi)로 시작하는 사
물인터넷(IOT)의 모든 것 – 초보에서 고급까지 (하) |
Original Book Contents
20.3.3 init script 작성
20.3.3.1 init script의 의미
시스템이 booting하거나 shutdown하는 과정에서 사용되는 script를 "init script"라고 한다. 모든 init script는 기본적으로 "/etc/init.d/" directory 밑에 넣어 두어야 한다.
init script에는 사용하는 용도에 따라 다음과 같이 여러 가지 종류가 있다.
n run level에 따라 특정 작업을 다르게 하기 위한 script
시스템 관리를 위해 필요한 다양한 작업을 할 수 있다.
n run level에 따라 특정 application daemon을 처리하기 위한 script
이런 init script는 그 script 이름을 application daemon 이름과 동일하게 만드는 것이 보통이다. 예를 들어 <TightVNC> 프로그램에 대해 booting할 때 daemon을 실행하는 script를 만들 수 있으며, 이런 init script는 "/etc/init.d/tightvnc"라는 이름으로 script를 작성한다.
n run level에 무관하게 정상 실행할 때는 항상 실행하기 위한 script
시스템 관리를 위해 필요한 다양한 작업을 할 수 있다.
20.3.3.2 run level 연동 init script 작성 방법
init script는 통상 다음과 같은 형식으로 작성한다. 처음에 설명하는 부분이 있고, 다음에는 변수를 선언하는 부분이 있으며, 그 다음에는 실제로 처리를 하는 부분으로 되어 있다.
#!/bin/bash # Start/stop the testpgm_init daemon. # script 설명 ### BEGIN INIT INFO # 주석항목: 주석 내용 ### END INIT INFO
#variable 선언 및 value 할당 NAME= testpgm SCRIPTNAME=/etc/init.d/"$NAME"
#요청에 따른 처리 case "$1" in start) 실행문 ;; stop) 실행문 ;; restart) 실행문 ;; reload|force-reload) 실행문 ;; *) 실행문 ;; esac exit 0 |
처음에 있는 부분들은 모두 주석이다. 여기에는 init script의 성격에 대해서 설명하는 내용들이 포함되어 있다. 여기에 있는 내용은 단순한 설명이며, 시스템에서 그런 방식으로 작동한다는 것을 설명하는 것이다.
~ 중략 ### BEGIN INIT INFO à 주석의 시작을 표시한다.
# Provides: testpgm_init àscript나 daemon의 이름을 지칭한다.
# Required-Start: $all à 다른 모든 정상 프로세스들이 처리된 이후에 이 script가 start되는 것을 의미한다.
# Required-Stop: $all à 다른 모든 정상 프로세스들이 처리된 이후에 이 script가 stop되는 것을 의미한다.
# Default-Start: 2 3 4 5 à시스템이 이 script를 start하는 run level을 말한다. 물론 이렇게 되도록 script를 등록해야 한다.
# Default-Stop: 0 1 6 à시스템이 이 script를 stop하는 run level을 말한다. 물론 이렇게 되도록 script를 등록해야 한다.
# Short-Description: Short-Description for testpgm_init à이 script에 대한 간략한 설명이다.
# Description: Full-Description for testpgm_init à이 script에 대한 상세한 설명이다.
### END INIT INFO à 주석의 종료를 표시한다. ~중략 |
다음에 정의하는 것은 해당 script에서 사용할 중요한 변수들이다. 여기서 정의되는 변수는 이 script내에서만 사용되며, script의 실행이 종료되면 없어지는 변수들이다.
마지막으로 정의하는 것이 실제 작업을 실행하는 부분이다. 여기서는 매개변수의 값에 따라서 각각의 처리를 정의하고 있다. booting sequence에서 해당 script를 실행할 때 실행 매개변수로 start, stop, restart 등을 지정하여 처리하게 된다. 그러면 init script는 매개변수 $1을 확인하고, 처리요청에 적절한 처리를 하게 되는 것이다.
20.3.3.3 application daemon 실행 init script 작성 방법
특정 application과 연동된 init script는 시스템이 booting/shutdown하는 과정에서 특정 application을 start/stop하기 위해서 사용한다. 즉 booting sequence에서 init script가 실행되고, init script가 특정 application을 start/stop하게 된다. 실제로 daemon에 대한 처리는 init script 내에서 이루어진다. 즉 기본적인 체계는 다음과 같다.
■ /etc/rcN.d/SnnAppl link
à/etc/init.d/Appl start à/etc/init.d/Appl의 start-daemon Appl àstart Appl
■ /etc/rcN.d/KnnAppl link
à/etc/init.d/Appl stop à/etc/init.d/Appl의 stop-daemon Appl àstop Appl
따라서 이렇게 특정 application을 start/stop할 때는 실행문에서 다음과 같은 문장을 사용할 수 있다.
n start 하기 위한 명령
■ start_daemon -p $PIDFILE $DAEMON
■ start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON
n stop 하기 위한 명령
■ stop_daemon -p $PIDFILE $DAEMON
■ killproc -p $PIDFILE $DAEMON
■ start-stop-daemon --stop --pidfile /$PIDFILE
다음은 특정 application을 start/stop시키는 init script의 일반적인 형식이다.
#!/bin/bash # Start/stop the testpgm_init daemon.
~중략
#variable 선언 및 value 할당 PATH=/bin:/usr/bin:/sbin:/usr/sbin DESC=" testpgm daemon" NAME= testpgm DAEMON=/usr/bin/testpgm PIDFILE=/var/run/testpgm.pid SCRIPTNAME=/etc/init.d/"$NAME"
#실행되는 프로그램 파일 확인 test -f $DAEMON || exit 0
#요청에 따른 처리 case "$1" in start) start 문 실행문 ;; stop) stop 문 실행문 ;; restart) stop 문 실행문 start 문 실행문 ;; reload|force-reload) 실행문 ;; *) 실행문 ;; esac exit 0 |
경우에 따라서 start/stop이 정상적으로 처리된 것을 확인한 이후에만 추가적인 작업을 하고자 할 때는 다음과 같은 형식으로 start-실행문이나 stop-실행문을 실행한다.
if ( start-실행문 / stop-실행문 ) ; then 실행문 else 실행문 fi |