개발을 하다 보면 지속적으로 반복해서 처리해야 하는 작업을 만날 때가 있다. 이런 경우 데몬으로 만들어서 터미널이 종료되더라도 항상 백그라운드에서 돌아가도록 하면 된다. 조금 더 정성을 기울인다면 ntsysvupdate-rc.d 같은 도구를 사용해 부팅시 자동으로 실행되도록 한다.

하지만 단순한 스크립트 작업을 데몬으로 만드는 것은 배보다 배꼽이 더 클뿐더러 단지 반복적으로만 실행하면 되는 경우가 많기 때문에 1분마다 crond를 통해 실행하도록 하는 방법도 자주 사용한다. 다만 이 경우 중복 실행을 막기 위해 잠금 파일(lockfile)을 통해 기존에 실행 중인 같은 스크립트가 있는지 확인하는 절차가 필요하다. 이 방법의 아쉬운 점은 실행 시간이 1분 단위이기 때문에 그 이하로 빈번히 동작해야 하는 스크립트에는 적용하기 어렵다는 단점있다.

이런 단점을 해결하고 좀 더 손쉽게 스크립트(또는 프로세스)를 항상 실행 할 수 있도록 하는데 도움이 되는 도구들이 있다. 여기서는 널리 쓰이는 데몬툴즈(daemontools)를 이용해 스크립트를 항상 실행하는 방법을 정리 해 보았다.

우선 데몬툴즈를 설치해야 한다. 설치 환경은 우분투 12.04를 기준으로 했다.

1
2
sudo aptitude install daemontools
sudo aptitude install daemontools-run

그 다음은 데몬툴즈의 서비스(service) 디렉토리를 살펴보고 run 스크립트를 찾아 실행시켜주는 svscan 서비스를 띄운다.

1
2
sudo service svscan start
pgrep -fl svscan

svscan 서비스가 동작하기 시작하면 /etc/service 디렉토리 안에 run 스크립트 파일을 찾아 supervise 도구를 이용해서 항시 run 스크립트가 실행되도록 자동으로 처리한다.

데몬툴즈의 기본 디렉토리는 /etc/service 이므로, 테스트를 위해 이 안에 foobar 디렉토리를 만든다.

1
2
3
cd /etc/service
sudo mkdir foobar
cd foobar

그 다음 run.new 파일을 다음 내용으로 생성한다.

1
2
3
#! /bin/sh

date >> /tmp/date.log

파일을 생성했으면 실행권한을 부여하고, run으로 이름을 변경한다. 이렇게 하는 이유는 supervise에 의해 언제 run 스크립트가 실행될지 모르므로 편집 중간에 실행되는 것을 방지하기 위해서다.

1
2
sudo chmod 755 run.new
sudo mv run.new run

run으로 이름을 바꾸면 바로 supervise가 run 파일을 실행하는 것을 확인 할 수 있다.

1
2
pgrep -fl supervise
tail -f /tmp/date.log

이렇게 실행한 run 스크립트는 svstat 명령을 이용해 동작 중인 것을 확인 할 수 있다. svstat을 사용하면 다른 관리 스크립트에서 실행 여부를 모니터링 하는데 유용하다.

1
sudo svstat /etc/service/foobar

만약 실행 중인 스크립트를 중지시키거나 시작 또는 재시작 하고 싶은 경우 svc 명령을 사용하면 된다. -u는 시작, -d는 중지다.

1
2
sudo svc -u /etc/service/foobar
sudo svc -d /etc/service/foobar

이 외에도 데몬툴즈에는 유용한 도구 및 기능들이 다수 포함되어 있으므로 다양하게 활용 가능하다.