Linux 에서 스 크 립 트 를 작성 하여 Daemon 을 실현 합 니 다.

Linux (Redhat Linux Enterprise Edition 5.3 을 예 로 들 면) 에 서 는 Service 를 작성 해 야 할 때 가 있 습 니 다.Service 도 프로그램 으로 일반적으로 시스템 시작 에 따라 사용자 가 관여 하지 않 으 면 종료 하지 않 는 프로그램 으로 Service 라 고 할 수 있다.리 눅 스 의 서 비 스 는 일반적으로 Daemon 이 라 고 부른다.
 
이상 은 넓 은 의미 의 Service 의 정의 입 니 다.Linux 의 서 비 스 는 일반적으로/etc/init. d 폴 더 아래 에 놓 여 있 습 니 다.이 폴 더 에 있 는 파일 을 찾 아 보면 Linux 에서 Service 를 작성 하 는 데 일반적으로 따 르 는 원칙 을 발견 할 수 있 습 니 다.
 
Linux 에서 Service 를 작성 하 는 것 은 일반적으로 따 르 는 원칙 입 니 다.
1) 실제 실행 되 는 서 비 스 는 일반적으로 어떤 빈 디 렉 터 리 아래 (/bin,/usr/bin, etc) 에 놓 여 있다.
2)/etc/init. d 폴 더 아래 는 보통 셸 스 크 립 트 로 빈 디 렉 터 리 의 서 비 스 를 제어 합 니 다.
3)/etc/init. d 폴 더 의 셸 스 크 립 트 는 보통 두 개의 인자, start 와 stop 를 받 습 니 다.status, reload, restart 등 자주 사용 되 는 추가 매개 변수 도 있 습 니 다.
4)/etc/init. d 폴 더 에 있 는 셸 스 크 립 트 는 최소한 두 줄 의 설명 을 포함 합 니 다. 한 줄 은 chkconfig 에 게 이 서비스 가 실행 되 는 runlevel 을 알려 주 고 우선 순 위 를 시작 하 며 우선 순 위 를 끝 냅 니 다.이 서비스 에 대한 설명 을 chkconfig 에 알려 줍 니 다.
 
Linux 시작 과정 과 RunLevel
리 눅 스 의 시작 과정 과 RunLevel 을 이해 하려 면 먼저/etc/inittab 파일 을 탐색 할 수 있 습 니 다./etc/inittab 에서 다음 7 가지 RunLevel 을 정의 합 니 다.모든 서 비 스 는 자신 이 어느 RunLevel 에서 실행 하 는 지 설정 할 수 있 습 니 다./sbin/init 를 호출 하여 해당 하 는 RunLevel 에 들 어 갈 수 있 습 니 다. 예 를 들 어/sbin/init 6 를 실행 하면 시스템 이 다시 시 작 됩 니 다.어떤 RunLevel 에서 서비스 가 시작 되 지 않 아 시스템 시작 에 실 패 했 을 경우 이 서 비 스 를 설정 하지 않 은 RunLevel 에 들 어가 서 이 서 비 스 를 사용 하지 않 거나 수정 할 수 있 습 니 다 (Windows 와 유사 한 보안 모드).
 
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
 
/etc/inittab 파일 에 서 는 결 성 RunLevel 도 정의 합 니 다.다음은 결 성 을 대표 하 는 RunLevel 은 5 입 니 다.
 
id:5:initdefault:
 
/etc 폴 더 에서 ls - d rc * 를 실행 하면 다음 파일 과 디 렉 터 리 를 보 여 줍 니 다.
 
rc  rc0.d  rc1.d  rc2.d  rc3.d  rc4.d  rc5.d  rc6.d  rc.d  rc.local  rc.sysinit
 
rc 는 스 크 립 트 입 니 다./etc/inittab 에서 RunLevel 에 따라 rc 를 실행 합 니 다.rc 스 크 립 트 는 해당 rcN. d 에 가서 다음 스 크 립 트 를 실행 합 니 다.rc. local 은 마지막 으로 호출 된 스 크 립 트 입 니 다. 사용자 정의 작업 을 넣 을 수 있 습 니 다.
 
rcN. d 폴 더 에 들 어가 면 S 와 K 로 시작 하 는 스 크 립 트 의 링크 를 발견 할 수 있 습 니 다. S 와 K 뒤에 2 자리 숫자 가 있 습 니 다.그 중에서 S 는 Start 를 대표 하고 K 는 Kill 을 대표 한다.S 시작 스 크 립 트 는 rc 에서 호출 할 때 start 인 자 를 가 져 옵 니 다.K 시작 스 크 립 트 는 rc 에서 호출 할 때 stop 인 자 를 가 져 옵 니 다.S 와 K 뒤에 달 린 2 자리 숫자 는 서비스의 우선 순 위 를 나타 내 며 숫자 가 클 수록 나중에 실행 된다.이 스 크 립 트 의 링크 의 목적 지 는 대부분/etc/init. d 폴 더 아래 에 있 습 니 다.
 
이제 모든 것 이 분명 해 졌 다.저 희 는 해당 rcN. d 폴 더 에서 정 해진 규범 에 따라/etc/init. d 스 크 립 트 의 소프트 링크 를 만 드 는 방식 으로 시스템 시작 과 종료 시 서비스의 시작 과 끝 을 제어 할 수 있 습 니 다.그러나 수 동 으로 소프트 링크 를 만들어 관리 하 는 것 은 불편 하기 때문에 RedHatLinux 는 chkconfig 를 제공 하여 이 소프트 링크 를 만 드 는 데 도움 을 주 었 습 니 다./etc/init. d 에 놓 인 서비스 제어 스 크 립 트 가 앞에서 언급 한 chkconfig 의 약속 에 부합 하기 만 하면 됩 니 다. 화해시키다 description), chkconfig -- add 를 사용 할 수 있 습 니 다. chkconfig -- list chkconfig -- del 등 명령 으로 서비스의 시작 여 부 를 제어 합 니 다.
 
하나의 예
다음은 c++ 언어 로 쓴 Service 입 니 다. 이 서 비 스 는/tmp/random 파일 에서 5 초 마다 4 개의 무 작위 숫자 를 생 성 합 니 다.g++ o my rand my rand. cpp 를 통 해 컴 파일 합 니 다.그리고 myrand 를/root/bin/폴 더 아래 에 놓 으 세 요.
myrand.cpp
/* myrand.cpp
 * this program read 4 chars from /dev/random in each iteration,
 * and then adjust it to 0-9. Finally the 4 chars are written
 * to /tmp/random. This is only for testing /dev/random, and
 * at the same time serve as a example service.
 */
#include 
#include 
using namespace std;
#include 
 
 
int main()
{
                while (true)
                {
                                ifstream ifile("/dev/random");
                                char ch;
                                char str[5];
                                str[4]=0;
                                int i;
                                for(i=0;i<4;i++)
                                {
                                                ifile >> ch;
                                                if(ch<0) ch=-ch;
                                                ch = ch % 10;
                                                ch='0' + ch;
                                                str[i]=ch;
                                }
 
                                ofstream ofile("/tmp/random");
                                ofile << str << endl;
                                sleep(5);
                }
}

다음은 스 크 립 트 입 니 다. 이름 은 my randservice 입 니 다./etc/init. d 폴 더 아래 에 두 십시오.
#!/bin/sh
#
# chkconfig: 2345  80 50
# description: myrandservice is for testing how to write service in Linux
#             
# processname: myrandservice
#
# Source function library.
. /etc/rc.d/init.d/functions
 
 
ret=0
 
 
start() {
    # check fdb status
                echo "start myrandservice"
                daemon /root/bin/myrand &
                ret=$?
}
 
stop() {
    echo "stop myrandservice"
                kill -9 $(ps -ef | grep myrand | grep -v grep | awk '{print $2}')
                ret=$?
}
 
status() {
                local result
                echo "check status of myrandservice..."
                #lines=$( ps -ef | grep myrand | grep -v grep  |  )
                #echo $lines
                result=$( ps -ef | grep myrand | grep -v myrandservice | grep -v grep | wc -l )
                #echo $result
                if [ $result -gt 0 ] ; then
                                echo "my randservice is up"
                                ret=0
                else
                                echo "my randservice is down"
                                ret=1
                fi
                echo "check status of myrandservice...done."
}
 
# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
                                status
        ;;
  *)
        echo {1}quot;Usage: $0 {start|stop|status}"
        exit 1
esac
 
exit $ret

예 설명
예 에서 스 크 립 트 의 아래 두 줄 은 chkconfig 에 사 용 됩 니 다.그 중에서 2345 는 이 서비스 가 RunLevel 2, 3, 4, 5 에서 열 린 다 는 것 을 의미한다.80 은 시작 우선 순위 입 니 다.50 대표 종료 우선 순위.RunLevel 에 값 을 추가 하지 않 고 "-"로 대체 하면 이 서 비 스 는 어떠한 runlevel 에서 도 자동 으로 시작 되 지 않 고 수 동 으로 시작 해 야 한 다 는 뜻 입 니 다.서비스 start/stop/status 등 을 통 해 서 비 스 를 제어 하거나 조회 할 수 있 습 니 다.
 
# chkconfig: 2345  80 50
# description: myrandservice is for testing how to write service in Linux
 
스 크 립 트 의 daemon 함 수 는/etc/rc. d/init. d/functions 에 존재 합 니 다.daemon 은/dev/null 로 출력 할 지, coredump 파일 생 성 여 부 를 설정 합 니 다.daemon 을 통 해 시 작 된 프로그램 은 사용자 가 명령 행 셸 을 종료 하 더 라 도 Service 가 실행 되 고 종료 되 지 않 을 것 을 보증 합 니 다./etc/rc. d/init. d/functions 에는 killproc, status 등 다른 유용 한 함수 도 포함 되 어 있 으 며, 각각 서 비 스 를 죽 이 고 서비스 상 태 를 볼 수 있 습 니 다.

좋은 웹페이지 즐겨찾기