Raspberry Pi_Kor_20.3.3 init script 작성


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

 

 

 

 

 


 

Leave a Reply