freezner

[linux] daemon 만들기

daemon(데몬) 이란 윈도우의 service 처럼 보이지 않는 곳에서 실행하고 있는 프로그램이라고 보면 됩니다. 뭐 다 아시겠지만..

데몬을 작성하는 방법은 잘 나와있지만 그 전에 어떻게 작성해야하고 어떻게 실행시켜야 하는지 모르는 분들을 위해 정리를 해봅니다.

* 이 포스트의 내용은 Centos 6.x 기준으로 작성되었습니다.

데몬을 만들고 실행시키는 과정은 간단히 이러합니다.
1. 소스코드 작성
2. 작성된 소스코드 컴파일
3. 데몬 파일 테스트
4. 컴파일된 데몬 파일 실행

코드는 c언어로.. 툴은 리눅스의 vim 에디터로 작성합니다. 그리고 컴파일은 gcc 로 하게 됩니다.

 

gcc 설치 여부 확인 및 설치

우선 컴파일을 하기 위한 gcc가 설치되어 있는지 확인을 해야합니다.

# yum info gcc | grep Repo

위 명령으로 gcc 패키지가 설치되어 있는지 확인 합니다. 설치가 안되 있다면 설치를 해야겠죠.

# yum install gcc

이미 설치가 되어있다면 위 과정은 패스합니다.

 

코드 작성하기

daemon은 일정 로직의 포맷이 있습니다. 어떤 daemon 이던지 기본적으로 거쳐야할 초기화 과정이 필요합니다. 여러 예제를 둘러보고 정리한 코드는 이렇습니다.

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	int pid;

	// fork 생성
	pid = fork();
	printf("pid = [%d] \n", pid);

	// fork 에러 발생 시 로그 남긴 후 종료
	if(pid < 0){
		printf("fork Error... : return is [%d] \n", pid );
		perror("fork error : ");
		exit(0);
	// 부모 프로세스 로그 남긴 후 종료
	}else if (pid > 0){
		printf("child process : [%d] - parent process : [%d] \n", pid, getpid());
		exit(0);
	// 정상 작동시 로그
	}else if(pid == 0){
		printf("process : [%d]\n", getpid());
	}

	// 터미널 종료 시 signal의 영향을 받지 않도록 처리
	signal(SIGHUP, SIG_IGN);
	close(0);
	close(1);
	close(2);

	// 실행위치를 Root로 변경
	chdir("/");

	// 새로운 세션 부여
	setsid();

	int cnt = 0;

	// 반복 실행이 필요한 코드면 while문 안에 삽입
	while(1) {
		// daemon이 죽었을 경우 다시 실행
		if((pid = fork()) < 0) {
			printf("fork error : restart daemon");
		}else if(pid == 0) {
			break;
		}else if(pid > 0) {
			wait(&ret);
		}

		// 10초 마다 체크
		sleep(10);
	}
}

위 코드에서 데몬으로 실행 시킬 로직은 while 문 안에 넣어주시고 실행 주기는 sleep문에 초단위로 설정해주시면 됩니다.

 

작성된 코드 컴파일하기

코드 작성이 끝났다면 저장하고 컴파일을 해야합니다. 컴파일 명령은 # gcc -o [출력 파일명] [컴파일 할 파일명] 입니다. -o 옵션 없이 # gcc [컴파일 할 파일명] 으로 실행하셔도 되는데 이경우 a.out으로 자동 네이밍되어 생성됩니다.

 

daemon 테스트

결과물로 컴파일이 정상적으로 되었다면 실행시켜 봅니다. 위 코드에서 보시다시피 printf로 pid를 출력하도록 되어있습니다. 그리고 프로세스 파일명과 pid를 확인하여 작성된 데몬이 잘 돌고 있는지 확인 합니다. 데몬 프로세스 확인은 아래 명령으로 가능합니다.

# ps -aux | grep [데몬파일명]

 

daemon 종료시키기

정상적으로 프로세스가 돌고 있는 것이 확인 되었다면 프로세스를 종료시켜야 겠죠? 프로세스 종료 명령어는 아래와 같습니다.

# kill -9 [데몬 pid]

 

여기까지 데몬 만드는 방법입니다. 리눅스 부팅 시 자동 실행되도록 하는 방법도 정리할 예정인데 내용이 길어져 다음 포스트에 올리도록 하겠습니다.

Exit mobile version