Superkkt Blog

Upstart는 우분투에서 개발한 System-V init을 대체하는 init daemon 프로그램이다. 우분투 6.10부터 도입된걸로 보이며, 10.10 버전은 기본적으로 Upstart를 사용하고, 하위호환성을 위해서 Upstart에서 init.d에 있는 스크립트들을 실행(/etc/init/rc*.conf)시키도록 되어있다.

Upstart는 /etc/init 디렉토리에 실행시킬 서비스를 텍스트 파일로 설정하면 된다. 파일명은 서비스명.conf 형식이고, 이 파일에 실행 권한을 줄 필요는 없다.

아래는 Asterisk를 Upstart 서비스로 등록하기 위해 /etc/init/asterisk.conf 파일을 생성하고 추가한 내용이다.

# Asterisk Service

description     "Asterisk server"
author          "Kitae Kim <superkkt@sds.co.kr>"

start on startup
stop on shutdown

respawn
expect fork

exec /usr/local/asterisk/sbin/asterisk

위 파일은 시스템 부팅 시 /usr/local/asterisk/sbin/asterisk를 실행시키고, 셧다운 과정에서 종료하도록 설정한다.

그리고 서비스가 정상적으로 stop되지 않고 종료되는 경우(kill 또는 segfault 발생 등) 자동으로 재실행 하도록 respawn 옵션을 설정했다. 이를 위해서는 Upstart가 PID를 추적해야 하는데 실행하려는 프로그램이 한번 fork를 해서 자식 프로세스를 만들거나, 두번 fork 해서 daemon이 되는 경우는 expect 옵션을 사용해서 Upstart에게 미리 알려줘야 한다. 그렇지 않으면 해당 서비스가 비정상 종료되었을 때 자동으로 재실행되지 않는다.

Asterisk는 한번만 fork해서 자식 프로세스를 만드는 형태로 실행되기 때문에 expect fork를 사용했다. 등록하려는 프로그램이 몇 번 fork를 하는지 모를때는 일단 expect daemon으로 설정한다. 그리고 아래에서 설명하는 방법으로 서비스를 시작했을 때 프롬프트가 다시 떨어지지 않고 hang이 걸리면 한번만 fork하는 프로그램이므로 expect fork로 설정하고, 프롬프트가 떨어지면 expect daemon을 그대로 사용하면 된다.

이제 Asterisk는 시스템 부팅시 자동으로 실행된다. 여기서는 아래와 같이 재부팅 없이 바로 서비스를 시작해보자.

$sudo start asterisk
asterisk start/running, process 30295

비정상 종료시 자동으로 재실행되는지 확인하기 위해 asterisk 프로세스를 kill로 죽여보자. 새로운 PID를 가지는 asterisk 프로세스가 다시 생기면 정상적으로 동작하고 있는것이다.

서비스 종료는 아래와 같이 할 수 있다.

$ sudo stop asterisk
asterisk stop/waiting

위에서 설명한 내용 외에도 Upstart는 다양한 설정이 가능하다. 예를 들어서 특정 런레벨에서 서비스가 실행되도록 하거나, 또는 특정 서비스가 먼저 실행된 후에 서비스가 실행되도록 설정할 수 있다. 그리고 exec로 특정 명령어를 실행하는 대신 script/end script 구문을 사용해서 쉘 스크립트를 직접 작성할 수도 있다.

자세한 내용은 아래 레퍼런스를 참조한다.

2011/04/21 00:25 2011/04/21 00:25

trackbacks

trackbacks rss

http://superkkt.com/trackback/660

Leave a Comment