Update-rc.d

한국 데비안 사용자 모임
둘러보기로 가기 검색하러 가기

이 프로그램은 시스템의 부팅과 종료에 관여하는 스크립트 관리기이다. 이 문서에서는 레드햇과의 차이점에 대해 다루지 않으므로 다른 서적이나 문서를 참조하기 바란다. 데비안에서는 기본적으로 실행 파일과 디렉토리 구조는 다음과 같다.

- 실행 파일

/sbin/init : init가 실행해야 할 모든 일이 명시된 파일
/etc/init.d/rc : 각 실행 단계 스크립트
/etc/init.d/rcS : init에서 처음으로 실행하는 스크립트

- 디렉토리

/etc/init.d : 각 실행 단계에서 실행되는 실제 스크립트가 저장
/etc/rcS.d : rcS 스크립트에 의해 실행되어질 명령 목록
/etc/rc0.d : 0 번 단계에서 실행되어질 명령 목록
/etc/rc1.d : 1 번 단계에서 실행되어질 명령 목록
/etc/rc2.d : 2 번 단계에서 실행되어질 명령 목록
/etc/rc3.d : 3 번 단계에서 실행되어질 명령 목록
/etc/rc4.d : 4 번 단계에서 실행되어질 명령 목록
/etc/rc5.d : 5 번 단계에서 실행되어질 명령 목록
/etc/rc6.d : 6 번 단계에서 실행되어질 명령 목록

데비안에서 데몬으로 프로그램을 돌아가게 하려면 /etc/init.d 안에 스크립트를 위치해야 한다. 그리고 나서 이것을 심볼릭 링크로 실행 단계 디렉터리들에 걸어줘야 한다. 이러한 링크를 걸어주는 작업을 해주는 것이 Update-rc.d이다. 그러나 이 작업은 약간의 무언가(?) 모르는 것이 있을 수 있으므로 직접 하려고 하지 말자. (친절하게 PostgreSQL의 init 스크립트는 단계까지 파일에 명시되어 있다.)

우선 실제 실행 단계 디렉터리에 파일이 어떤 이름으로 있는지 확인해 본다. SnnXXXX, KnnXXXX 등의 이름으로 되어 있을 텐데, 여기서 S와 K는 각각 start 매개변수와 stop 매개변수를 의미한다. XXXX는 실제 프로그램을 의미하는 단어가 많고, nn는 실행 순서를 의미한다. 이 숫자는 실행 스크립트의 순서를 맞추려는 것으로 항상 작은 숫자를 먼저 실행한다. 단, 이 숫자는 00에서 99까지만 허용한다.

조금 더 자세히 보면 rc0.d, rc1.d, rc6.d에는 K로 시작하는 파일만 있으며 나머지는 S로 시작되는 파일만 있다(거기 있는 것은 심볼릭 링크라는 것을 다시 한 번 상기 바란다). 그런데 이렇게 외워야 하는 내용이 많다면 차라리 레드햇을 쓰고 말겠다하는 독자도 여럿 있을지 모른다. 아니면 조금 더 편한 방법을 찾거나. 여기 그 편한 방법이 있다. /etc/rc.boot 디렉토리 안에 실행하기를 원하는 스크립트를 넣고 실행 권한을 넣어주면 자동으로 실행한다. 그러나, 이 방법은 편하기만 할 뿐 관리 정책에 상당한 비효율성을 가지고 오게 된다.

update-rc.d [-n | -f] <스크립트명> [remove | defaults] <실행순서>

우선 간단하게 sample이라는 스크립트를 /etc/init.d에 넣고 다음과 같은 명령을 내린다면 시스템이 임의의 순서를 부여해 심볼릭 링크를 만들어 줄 것이다.

update-rc.d sample defaults

그렇다면 처음 실행할 때 몇 순위가 될 것인가. 이것은 defaults의 뒤에 써주면 된다. 내가 98 번째 실행하고 싶다면 다음과 같이 실행하면 된다.

update-rc.d sample defaults 98

하지만 더 나아가서 종료 순서까지 정해주고 싶다면 다음과 같이 한다. 내가 원하는 종료 순서는 2 번째이다.

update-rc.d sample defaults 98 02

처음 숫자는 실행 순서, 다음 숫자는 종료 순서이다. 다들 이해하셨으리라 본다. 심볼릭 링크를 만드는 방법은 알았지만 삭제하는 방법은 아직 배우지 않았으니 다시 한 번 간다. 기본적으로 위에 보면 defaults 말고 remove가 있는데, 이것이 바로 삭제 옵션이다. 위에서 등록한 sample을 제거하기 위해선 다음과 같이 명령을 내려준다.

update-rc.d sample remove

그러나 여기서 주의할 점은 이때 심볼릭 링크를 지우려는 프로그램의 스크립트, 다시 말해 /etc/init.d 안에 있는 실제 링크되어 있는 파일을 먼저 지워야 한다는 것인데, 같이 지울 수 있다. 같이 지울려면 다음과 같이 한다.

update-rc.d -f sample remove

옵션 중에 -n, -f가 있는데 -n은 명령을 실행하는 일을 보여주며, 실제 어떤 일도 하지 않는다. -f는 실제 스크립트와 심볼릭 링크 모두를 지우는 옵션이다. 그렇다면 init.d 디렉토리에 위치해야 하는 파일은 어떤 구조를 가지고 있을까. 이것은 일반적인 구조가 있다.

case $1 in
 start)
   <실행할 명령이나 스크립트명>
   ;;
 stop)
   <중지할 명령이나 스크립트명>
   ;;
 restart)
   <중지하고 다시 시작할 명령이나 스크립트명>
   ;;
 *)
   echo "Usage: /etc/init.d/$NAME {start|stop|restart}"
   exit 1;
   ;;
esac 

exit 0

가 실행 스크립트의 일반적인 구조이다. 우리가 설치하는 대부분의 프로그램은 이러한 스크립트를 제공하거나 짜는 방법이 있으므로 참고하기 바란다. 이 이상에 대한 것은 틈날 때마다 업그레이드할 수 있도록 노력하겠다 - search5