시스템을 이제 다 만들어 가는지라, 기존에 일일히 실행 해서 쓰던 서버들을 이제 데몬으로 올리려 임베디드 리눅스 파일 시스템 /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 + 숫자 + 이름 구조를 잊지 않도록 한다.
이로서 이제 자동으로 만들어 두었던 서비스 서버는 데몬으로 잘 돌아 가게 된다. 좀 더 정리를 해 주자면 ..
- ARM ELF 바이너리 를 /usr/sbin 안에 넣는다.
- 이제 /etc/init.d 안에 스크립트로 데몬으로 돌려 주도록 넣어 줌
- 그런 다음 /etc/rcS.d 안에 /etc/init.d 안에 만든 스크립트를 심볼릭 링크로 걸어줌.
이걸로 고전적인 방법이 떠오르지 않아 고생한 사람이 있다면 도움이 되길 바라며 ...