본문 바로가기

Developement/eLinux

서비스 데몬을 만드려다 노가다 하다 ...

시스템을 이제 다 만들어 가는지라, 기존에 일일히 실행 해서 쓰던 서버들을 이제 데몬으로 올리려 임베디드 리눅스 파일 시스템 /etc/rc.local 뒤에 뙇 넣어 놨더니 ... 하 ... rcS.d 세션이 끝나니 다들 죽으신다 ... 대체 언제적 문제인가 해서 back to the past.





 현재 개발 하는 시스템은 squashfs 를 이용한 NAND writing 을 하기 때문에 미리 sqfs 를 만들 위치에서 부터 ARM ELF 로 만들어진 바이너리를 각각 /usr/sbin 안에 넣어 준다.

 예를 들어 서비스 서버로 만들었던 것 중 하나가 asctrld 이라면 /usr/sbin/ 안에 asctrld 를 넣어 주는 것.

 그런 다음, 아래 스크립트를 복붙 으로 /etc/init.d 안에 asctrld 로 만들어 주도록 하자.


#!⁄bin⁄sh
#init.d service control script by rage.kim@3iware.com

set -a

PATH=⁄sbin:⁄bin:⁄usr⁄bin:⁄usr⁄sbin

# Source function library.
. ⁄etc⁄init.d⁄functions

prog="asctrld"
binpath="⁄usr⁄sbin⁄$prog"
pidfile="⁄var⁄run⁄$prog.pid"

[ -f $binpath ] || exit

start(){
    echo -n "Starting $prog ... "
    start-stop-daemon --start -m -p $pidfile -n $prog --exec $binpath --background
    echo "."
}

#default --stop send signal 15 (SIGTERM)
stop(){
    echo -n "Stopping $prog ... "
    start-stop-daemon --stop --quiet -n $prog --pidfile $pidfile
    echo "."
}

reload(){
    echo -n "Reloading $prog ... "
    echo "."
}

# See how we are called.
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    reload)
        reload
        ;;
    restart)
        stop
        start
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|reload}"
        exit 1
esac

exit 0

 위 스크립트에서 다른 서비스용으로 만들려면 당연 prog="" 안의 이름을 바꿔야 하며, pid 위치도 만약에 /var/run 이 read-only (일리는 없지만) 라면 다른 위치로 옮기도록 해야 한다.

 그런 다음 이제 rcS.d 에 init.d 안의 이름을 심볼링 링크로 만들어 준다. 일단 asctrld 로 했으니 이것 역시 똑같이.


/etc/rcS.d # ln -s /etc/init.d/asctrld S40asctrld


 rcS.d 에서 실행 순서는 파일 이름순 이란걸 명심 하고, 앞에 S + 숫자 + 이름 구조를 잊지 않도록 한다.

 이로서 이제 자동으로 만들어 두었던 서비스 서버는 데몬으로 잘 돌아 가게 된다. 좀 더 정리를 해 주자면 ..

  1. ARM ELF 바이너리 를 /usr/sbin 안에 넣는다.
  2. 이제 /etc/init.d 안에 스크립트로 데몬으로 돌려 주도록 넣어 줌
  3. 그런 다음 /etc/rcS.d 안에 /etc/init.d 안에 만든 스크립트를 심볼릭 링크로 걸어줌.

 이걸로 고전적인 방법이 떠오르지 않아 고생한 사람이 있다면 도움이 되길 바라며 ...