LINUX byDreamy postedSep 30, 2015

리눅스 부팅시 명령스크립트 실행하기

?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

+ - Up Down Comment Print


1. 심볼릭링크


윈도우XP에서 한글2005를 실행시킬때의 구조를 살펴보자. 
설치시 특별히 디렉토리를 변경하지 않았다면, 실행파일은 다음의 위치에 있다.

    C:\HNC\Hwp65\hwp.exe


그러나, 우리는 탐색기를 열어서.. C:\HNC\Hwp65\hwp.exe 파일을 더블클릭해서 직접 
실행하지는 않는다. 보통은, '시작>프로그램>한글과컴퓨터>한글2005>한글 2005'를 
실행하거나, 아니면, 바탕화면의 단축아이콘을 더블클릭한다.

단.축.아.이.콘...!!

윈XP에서의 단축아이콘이 리눅스에서의 심볼릭링크이다.


2. /etc/rc.d/init.d/* 파일들의 이해


MS윈도우즈에서 프로그램을 설치하면 대부분 'C:\Program Files' 안에 설치된다. 
물론, 다른 디렉토리에 설치해도 된다. 
리눅스도 각각의 프로그램들(데몬들)을 원하는 디렉토리에 설치할 수 있다. 
rpm으로 설치한다면, 특정 디렉토리가 지정되어 있겠지만... 
소스로 설치할 때는 원하는 디렉토리에 설치한다.


apache를 소스설치할 때, --prefix 옵션으로 설치 디렉토리를 지정할 수 있는 것처럼 말이다. 
물론, 관습적으로 대부분 /usr/local/ 밑에 설치하는 경향이 많다. 이렇게 각각의 디렉토리에 
설치된 각각의 데몬들을 실행하거나, 중지하는 등의 관리를 할 때는 상당히 불편하다. 
각 데몬이 어디에 설치되어 있는지 모두 알아야 하기 때문이다.


생각해보자.

어느누가 네임서버 데몬을 실행시키는데...

    # /usr/sbin/named

와 같이 데몬의 실행파일을 직접 실행시키겠는가..?? 
보통은...

    # /etc/rc.d/init.d/named start

와 같이 실행시킨다...


그렇다. 각 데몬의 실행파일들이 어디에 있는지와 상.관.없.이, 관리의 편의를 위하여.... 
각 데몬들을 실행할 수 있게 만든 쉘스크립트파일을 모아놓고 관리를 한다.


그 디렉토리가 /etc/rc.d/init.d/ 디렉토리이며, 
/etc/rc.d/init.d/ 밑의 모든 파일들은 vi 편집기로도 열리는, 쉘스크립트 파일들이다. 
마치, 윈XP에서 각 프로그램들을 하드에 설치하고.. 실행할 때는 '시작>프로그램>....' 
에서 실행하는 것과 비슷하다.


3. 런레벨의 이해 

기본적으로 다음 두 가지는 알고 있다고 가정하자.


① 런레벨 종류 
    - 런레벨 1 : 싱글모드 부팅. MS윈도우즈의 안전모드와 비슷 
    - 런레벨 3 : 콘솔모드로 부팅 
    - 런레벨 5 : X 윈도우로 부팅 
    - 런레벨 6 : 계속 재부팅만 한다.

② 런레벨 수정 
    - /etc/inittab 파일에서 다음 항목의 숫자를 직접 수정함으로 변경 가능 
      id:3:initdefault:


이제, 윈XP의 '시작>프로그램>시작프로그램' 을 생각해 보자. 
시작프로그램에 특정 프로그램을(프로그램의 단축아이콘을) 등록해 놓으면, 
컴퓨터를 켤 때 그 프로그램이 자동으로 실행된다. 
리눅스도 시작할 때 자동으로 실행될 프로그램(=데몬)을 등록할 수 있다. 
윈XP에서는 '시작프로그램'에 등록하지만, 리눅스는 디렉토리에 심볼릭링크를 만들어서 등록한다.


- /etc/rc.d/init.d/rc3.d   :

런레벨 3으로 부팅될 때 자동실행할 데몬을 등록하는 곳

-/etc/rc.d/init.d/rc5.d   :

런레벨 5로 부팅될 때 자동실행할 데몬을 등록하는 곳


필자는 런레벨 3으로 부팅하며, 다음과 같은 심볼릭링크 파일들을 볼 수 있다.

# cd /etc/rc.d/rc3.d/ 
# ls -al 
drwxr-xr-x    2 root   root    4096 12월 15 10:32 ./ 
drwxrwxr-x   10 root   root    4096 12월 15 19:02 ../ 
lrwxrwxrwx    1 root   root    13 12월 15 19:01 K15gpm -> ../init.d/gpm* 
lrwxrwxrwx    1 root   root    20 12월 15 19:02 K44rawdevices -> ../init.d/rawdevices* 
lrwxrwxrwx    1 root   root    18 12월 15 19:02 K45arpwatch -> ../init.d/arpwatch* 
lrwxrwxrwx    1 root   root    15 12월 15 19:02 K75netfs -> ../init.d/netfs* 
lrwxrwxrwx    1 root   root    15 12월 15 10:30 K95kudzu ->../init.d/kudzu* 
lrwxrwxrwx    1 root   root    17 12월 15 19:02 S10network ->../init.d/network*   
lrwxrwxrwx    1 root   root    16 12월 15 19:01 S12syslog -> ../init.d/syslog* 
lrwxrwxrwx    1 root   root    18 12월 15 19:00 S17keytable -> ../init.d/keytable* 
lrwxrwxrwx    1 root   root    16 12월 15 19:02 S20random -> ../init.d/random* 
lrwxrwxrwx    1 root   root    17 12월 15 19:02 S29sysstat -> ../init.d/sysstat* 
lrwxrwxrwx    1 root   root    15 12월 15 10:32 S55named ->../init.d/named* 
lrwxrwxrwx    1 root   root    16 12월 15 19:02 S56xinetd -> ../init.d/xinetd* 
lrwxrwxrwx    1 root   root    15 12월 15 19:02 S90crond -> ../init.d/crond* 
lrwxrwxrwx    1 root   root    11 12월 15 19:02 S99local -> ../rc.local* 
lrwxrwxrwx    1 root   root    23 12월 15 19:02 S99oops-firewall -> color=#008000>../init.d/oops-firewall*


디렉토리 안을 살펴보니, 모두 심볼릭링크 파일이라는 것을 알 수 있다. 
심볼릭링크 파일은 제일 앞의 퍼미션을 나타내는 부분이 'l' 로 시작되며, 
어떤 파일을 심볼릭링크했는지 화살표로 표시해 준다. 
살펴보면, 모든 심볼릭링크의 원본파일들이 상위 디렉토리(../)의 init.d 디렉토리 내의 파일들,

즉, /etc/rc.d/init.d/파일들 이라는 것을 볼 수 있다.


따라서, 각 데몬의 실행파일을 관리하는 스크립트 파일들을 심볼릭링크한 것이다.

/etc/rc.d/rc3.d/ 밑의 파일들의 파일명을 살펴보면 다음과 같은 형식이다.

  S[혹은 K]{숫자}{데몬파일명}

S 로 시작되는 링크파일은 부팅할 때 시작(Start)되는 스크립트파일이다. 
K 로 시작되는 링크파일은 부팅할 때 시작되지 않는(Kill) 스크립트파일이다. 
{숫자}는 실행되는 우선순위를 나타낸다.

crond 데몬보다, named 데몬이 중요하고 꼭 실행되어야 한다면... crond 링크보다 숫자를 낮은 
숫자로 하면 된다.예전에는 컴퓨터(서버)의 사양이 좋지 않아, '어떻해도 가장 중요한 데몬'을 
실행시키기 위해서 있었지만.. 지금은 별 의미가 없다.. 
실행되지 않을 정도의 하드웨어 사양을 찾기가 힘들다... ^^;


{숫자}는 같은 숫자로 중복해서 사용할 수도 있다.

ntsysv 명령어로 각 데몬을 체크하거나, 체크를 지우는 것도... 
알고보면 S 를 K 로 바꾸거나, K 를 S 로 바꾸는 작업이다.

/etc/rc.d/rc3.d/ 디렉토리에서는 S로 시작해서 심볼릭링크가 되어 있고, 
/etc/rc.d/rc5.d/ 디렉토리에서는 K로 시작해서 심볼릭링크가 되어 있다면... 
같은 /etc/rc.d/init.d/ 밑의 같은 데몬스크립트 파일이라고 하더라도.. 
런레벨마다 실행되거나, 실행되지 않을 수 있다.



1. 실행시킬 스크립트 작성

vi /etc/rc.d/init.d/작성할파일명
ex) vi /etc/rc.d/init.d/tomcat

####################################
# auto start tomcat
####################################
#!/bin/sh
# chkconfig를 사용하기 위한 구문
chkconfig: 345  90  20 
description: GridCenter is Cluster Power Middleware .. 


export TOMCAT_HOME=/app/tomcat      #경로 설정

 

#

case "$1" in
start)     #시작시 행동
echo -n "Starting tomcat: "
daemon $TOMCAT_HOME/bin/startup.sh
echo
;;
stop)      #종료시 행동
echo -n "Shutting down tomcat : "
daemon $TOMCAT_HOME/bin/shutdown.sh
echo
;;
restart)     #재시작시 행동
$0 stop
$0 start
;;
*)            #기타 인수 없을때 메세지
echo "Usage : $0 {start|stop|restart}"
exit1
esac
exit 0



2. 생성한 스크립트 권한 변경 후 정상작동 테스트


chmod 755 파일명


etc/rc.d/init.d/ 에서


./파일명 start



3. chkconfig 등록


chkconfig --add <scripts file name> 


위에서 설정한

# chkconfig: 345  90  20 


chkconfig 뒤의 345 는 런레벨을 의미하고 90 20 은 booting, halt 시 start, stop 되는 순서이다. 



이렇게 되면 설정한 런레벨 경로에

시작파일은 S<레벨><파일이름> 형식으로 심볼릭 링크가 생성되고

종료파일은 K<레벨><파일이름> 형식으로 심볼릭 링크가 생성된다.




<원본 출처 : http://blog.naver.com/couplewith/60007889350 >

[개요]

 mysql이나 apache와 같이 사용자가 직접 설치한 프로그램들을 부팅시 자동으로  실행하기 위해서는chkconfig와 ntsysv를 사용한다.

 

chkconfig를 알기 전에 runlevel과 init.d 그리고 setup과 같은 로딩 서비스 관리 툴의 연관을 이해 하여야 겠습니다.

 

가. About Run-level ?  

    리눅스나 유닉스는 runlevel이라는것이 존재 한다.

    일반적으로 Window 에서 Safe 모드와 prompt모드와 일반 모드로

    부팅시 선택 할수 있듯이, unix도 다양한 구동 방식이 존재한다

    이것을 runlevel 이라고 하며 부팅시 선택 되도록 되어있다.

 

    그리고 슈퍼관리자를 위해서 콘솔에서 직접  /sbin/init 라는 명령으로 제어가 가능하다.

    > init 6 : 리부팅 시스널을 일으키고

    > init 0 : 라고 하면 시스템이 halt 되거나 power를 내린다.

 

    부팅시 선택 되도록 설정한 환경은

    /etc/inittab 라는 파일에 다음과 같이 명시되어 있다

 

$> vi /etc/inittab

# Default runlevel. The runlevels used by RHS are:
#   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)

id:3:initdefault:

 

id:3:initdefault: 에서 3 이라고 명시 하면  Full multiuser mode 로 text 기반 콘솔로 로딩이 된다

id:5:initdefault:  로 설정 하면 Full multiuser mode  + X11 로 로딩 되며, [GUI] 기본 콘솔이 Xwindow ,그놈 같은 콘솔을 사용 할수 있다.

/sbin/runlevel 라는 명령은 N 3 과 같이 현재 설정된 runlevel를 알려 줍니다.

 

그리고 runlevel이 선택 되면 각 레벨에 따라 설정된 프로그램 들이 로딩되게 됩니다.

이들은 각각 디렉 토리로 분류하여 스크립트로 정의 되어 있습니다.

/etc/rc.d/init.d 에는 부팅시 사용 할수 있는 전체 서비스 로딩 스크립트들이 있습니다.

그리고 /etc/rc1.d /etc/rc2.d /etc/rc3.d .... 등으로 runlevel 마다 별도의 디렉 토리가 있고

이들은 구동할수 있는  서비스들을 K10xfs -> ../init.d/xfs 와 같이 init.d의 파일을 링크해 두었습니다.

 

. About ntsysv ?    

    리눅스 서비스 관리를 하게 되면 기본적으로  아래 3가지 툴을 알아야 한다.

    그리고 이들을 이용해서 관리를 하기 위한 기본적인 지식을 경험 하다보면

    아래 chkconfig 를 쓸 일이 생길 것입니다.

$> setup

    Setup    :Text Mode Setup Utility 로 아래 5가지 섹션을 관리 하는 메인이다.

             1. Authentication configuration  

             2. Firewall configuration
             3. Mouse configuration

             4. Network configuration

             5. System services

    netconfig :  위 setup의  4. Network configuration 와 같다

    ntsysv     :   위 setup의  5. System services 와 같다

 

    따라서 어렵게 여러게 알기 힘들면 setup 이라는게 있구나. 

    ntsysv 같은 것은 일반 사용자들이 chkconfig를 쉽게 쓰도록 만든 프로그램이라고 보면 된다.


다. About chkconfig ?

 mysql 이나 apache 같은 사용자가  설치한 프로그램 들을 부팅시 자동으로  실행 하기 위해서 이 프로그램을 사용한다.


 chkconfig는 /etc/rc.dinit.d/ 에 명시 되지 않은 서비스는 설정이 안된다.

 먼저  /etc/rc.d/init.d 에 해당 스크립트를 생성 하여 두어야 한다.

 

 다음은 chkconfig에 대한 맨페이지 설명이다.

 

$> man chkconfig

 NAME                 
       chkconfig  -  updates  and queries runlevel information for system services

       시스템 서비스의 runlevel 정보를 수정 하고 조회 하는 유틸리티이다.

       

 SYNOPSIS

      다음과 같은 옵션 들을 가지 고 있으며
       chkconfig --list [name]
       chkconfig --add name
       chkconfig --del name
       chkconfig [--level levels] name <on|off|reset>
       chkconfig [--level levels] name

 

 OPTIONS
       --level levels
              Specifies the run levels an operation should pertain to.

              It  is given  as  a string of numbers from 0 to 7. For example, --level
              35 specifies runlevels 3 and 5.

              조회 수정 대상이 되는 runlevel을 지정 하는 옵션이다.

             0 부터 7 까지 부여 할수 있고, 두개 이상일 경우 --level 35 라고 하면

            runlevel 3 과 5를 동시에 지정한다는 의미이다.

 

       --add name

              This option adds a new  service  for  management  by  chkconfig.
              새로운 서비스 entry 를 추가하기위한 옵션이다.

              When  a new service is added, chkconfig ensures that the service
              has either a start or a kill entry in  every  runlevel.

              새로운 서비스가 추가 될때 모든 runlevel에서 start와 kill이 가능한지 점검하고

            

             If  any  runlevel  is missing such an entry, chkconfig creates the appro-
              priate entry as specified by the  default  values  in  the  init script.

 

              chkconfig 는 init 스크립트에 다음과 같은 entry를 검사한다.

             그리고 없는 것에 대해서 경고를 하게 된다.

             # chkconfig: - 50 50
             # description: init file for Apache2 server daemon
             # processname: /usr/local/apache2/apachectl
             # config:      /usr/local/apache2/conf/httpd.conf
             # pidfile:     /usr/local/apache2/logs/httpd.pid

             같은 부분이 필요하다.

 

       --del name
              The  service  is removed from chkconfig management, and any sym-
              bolic links in /etc/rc[0-6].d which pertain to it are removed.

              각 runlevel /etc/rc[0-6].d 에 속하는  해당 서비스 링크를 삭제 한다.

 

       --list name
              This option lists all of  the  services  which  chkconfig  knows
              about, and whether they are stopped or started in each runlevel.
              If name is specified, information in only display about  service name.
            

 

라. 사용 예제 [apache 자동 수행]

 

Apached 를 등록 하여 부팅시 자동 수행 되도록 해보자

 

step 0) chkconfig 로 서비스 확인 하기

 

$> chkconfig --list

  아래와 같이 각 runlevel 에 설정된 서비스 목록 을 볼수 있다.

  구동 하고자 하는 서비스의 등록 상태를 확인하자.

  현재 apached 가 없다는 것을 확인 할 수 있다.

  

$> chkconfig --list

dkms_autoinstaller      0:off   1:off   2:on    3:off   4:on    5:on    6:off
kudzu           0:off   1:off   2:off   3:off   4:on    5:on    6:off
syslog          0:off   1:off   2:on    3:on    4:on    5:on    6:off
netfs           0:off   1:off   2:off   3:off   4:on    5:on    6:off
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
random          0:off   1:off   2:on    3:off   4:on    5:on    6:off
rawdevices      0:off   1:off   2:off   3:off   4:on    5:on    6:off
pcmcia          0:off   1:off   2:on    3:off   4:on    5:on    6:off
saslauthd       0:off   1:off   2:off   3:off   4:off   5:off   6:off
keytable        0:off   1:on    2:on    3:off   4:on    5:on    6:off
apmd            0:off   1:off   2:on    3:off   4:on    5:on    6:off
atd             0:off   1:off   2:off   3:off   4:on    5:on    6:off
gpm             0:off   1:off   2:on    3:off   4:on    5:on    6:off
autofs          0:off   1:off   2:off   3:off   4:on    5:on    6:off
iptables        0:off   1:off   2:on    3:off   4:on    5:on    6:off
irda            0:off   1:off   2:off   3:off   4:off   5:off   6:off
nscd            0:off   1:off   2:off   3:off   4:off   5:off   6:off
isdn            0:off   1:off   2:on    3:off   4:on    5:on    6:off
sshd            0:off   1:off   2:on    3:off   4:on    5:on    6:off
portmap         0:off   1:off   2:off   3:off   4:on    5:on    6:off
nfs             0:off   1:off   2:off   3:off   4:off   5:off   6:off
nfslock         0:off   1:off   2:off   3:off   4:on    5:on    6:off
sendmail        0:off   1:off   2:on    3:off   4:on    5:on    6:off
rhnsd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off
anacron         0:off   1:off   2:on    3:off   4:on    5:on    6:off
xfs             0:off   1:off   2:on    3:off   4:on    5:on    6:off
xinetd          0:off   1:off   2:off   3:on    4:on    5:on    6:off
vsftpd          0:off   1:off   2:off   3:on    4:off   5:off   6:off
snmpd           0:off   1:off   2:off   3:on    4:off   5:off   6:off
raidmon         0:off   1:off   2:on    3:on    4:on    5:on    6:off
xinetd based services:
        chargen-udp:    off
        rsync:  on
        chargen:        off
        daytime-udp:    off
        daytime:        off
        echo-udp:       off
        echo:   off
        services:       off
        servers:        off
        time-udp:       off
        time:   off
        sgi_fam:        off
        telnet: on

 

(step 1) init 스크립트 생성하기

 apache 나 mysql같은 프로그램이 구동 될수 있도록 init 스크립트를 만들어야 한다.

 cp /etc/rc.d/init.d/sendmail /etc/rc.d/init.d/apached 라는 스크립트로 이름을 바꾸어 보자.


 apached 라는 스크립트 에 apacehclt start 와 stop restart 를 쓸수 있도록  수정 하자.


$> cd /etc/rc.d/init.d

$> vi ./apached 

#!/bin/bash
#
# chkconfig: - 50 50
# description: init file for Apache2 server daemon

# processname: /usr/local/apache2/apachectl
# config:      /usr/local/apache2/conf/httpd.conf
# pidfile:     /usr/local/apache2/logs/httpd.pid
#
# source function library
. /etc/rc.d/init.d/functions

# pull in sysconfig settings


RETVAL=0
prog="apaceh2"

# Some functions to make the below more readable
APACHE2_HOME=/usr/local/apache2
APACHED=$APACHE2_HOME/bin/apachectl

start()
{
        # Create keys if necessary
        echo -n $"Starting $prog :"
        sh $APACHED start && success || failure
        RETVAL=$?
        return $RETVAL
}

stop()
{
        echo -n $"Stopping $prog:"
        sh  $APACHED stop && success || failure
        RETVAL=$?
        return $RETVAL
}


case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                stop
                start
                ;;
        *)
                echo $"Usage: $0 {start|stop|restart}"
                RETVAL=1
esac
exit $RETVAL


[주의 사항]

# chkconfig: - 50 50
# description: init file for Apache2 server daemon

 

이부분이 반드시 있어야 하며 없으면

service a does not support chkconfig 라는 에러가 난다.

 

$> chmod +x apached

 실행이 가능 하도록 파일 실행 권한을 부여한다.

 

(step 2) chkconfig 로 서비스 관리 하기

$> chkconfig --add apached

    라고 하면 모든 서비스 목록에 추가 될것이다.

$> chkconfig --del apached

    라고 하면 모든 서비스 목록에 삭제 될것이다.

 

$> chkconfig --add apached

$> chkconfig --list |grep apached

apached         0:off   1:off   2:off   3:off   4:off   5:off   6:off

  라고 설정 된것을 확인 할수 있다.

 

$> chkconfig --level 35 apached on

   는 chkconfig --level 3 apached on 와 chkconfig --level 5 apached on

   를 동시에 수행 한것과 같습니다.

 

root]# chkconfig --list | grep apached

apached         0:off   1:off   2:off   3:on    4:off   5:on    6:off


(step 3) ntsysv 로 서비스 관리 하기

 

ntsysv로도 위의 내용을 변경 가능 하다.

다만 ntsysv의 경우  목록에 보이지 않으면

먼저 chkconfig --add NAME 로 해당 서비스를 각 runlevel에 등록 해야 한다.

 

root#> ntsysv --level 35

 로 화면에서 apached를 '*' 로 선택(스페이스키) 하면

 chkconfig --level 35 apached on 와 같은 결과를 같게 됩니다.

 

[결론]

    이상으로 프로그램 실습을 마치며, 위의 설정을 이해한 후 리눅스 상에서 프로그램 자동 실행 시키는데 유용하게 사용하길 바랍니다


나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5