본문으로 바로가기

리눅스 운영중에 쉘에 시작(start)과 종료(stop) 그리고 재시작(restart) 파라메터를 받아서 해당 작업을 수행하는 방법을 설명합니다.

shell.sh start/stop/restart/stutus

1. 쉘 스크립트 만들기

아래 코드는 참고자료의 링크에 해당하는 내용입니다. 아래 예제는 memcached 명령을 예시이며 사용하고자 하는 로직에 따라 수정하여 사용합니다.

#!/bin/bash
#
# 쉘이 실행할 명령을 아래의 내용을 수정합니다.
################################################################
BASE=/tmp
PID=/tmp/app.pid
LOG=/tmp/app.log
ERROR=/tmp/app-error.log

PORT=11200
LISTEN_IP = '0.0.0.0'
MEM_SIZE=4
CMD='memcached'
COMMAND='$CMD -p $PORT -l $LISTEN_IP -d -m $MEM_SIZE -v -p $PID'
################################################################

USR=user

status() {
    echo
    echo "==== Status"

    if [ -f $PID ]
    then
        echo
        echo "Pid file: $( cat $PID ) [$PID]"
        echo
        ps -ef | grep -v grep | grep $( cat $PID )
    else
        echo
        echo "No Pid file"
    fi
}

start() {
    if [ -f $PID ]
    then
        echo
        echo "Already started. PID: [$( cat $PID )]"
    else
        echo "==== Start"
        touch $PID
        if nohup $COMMAND >>$LOG 2>&1 &
        then echo $! >$PID
             echo "Done."
             echo "$(date '+%Y-%m-%d %X'): START" >>$LOG
        else echo "Error... "
             /bin/rm $PID
        fi
    fi
}

kill_cmd() {
    SIGNAL=""; MSG="Killing "
    while true
    do
        LIST=`ps -ef | grep -v grep | grep $CMD | grep -w $USR | awk '{print $2}'`
        if [ "$LIST" ]
        then
            echo; echo "$MSG $LIST" ; echo
            echo $LIST | xargs kill $SIGNAL
            sleep 2
            SIGNAL="-9" ; MSG="Killing $SIGNAL"
            if [ -f $PID ]
            then
                /bin/rm $PID
            fi
        else
           echo; echo "All killed..." ; echo
           break
        fi
    done
}

stop() {
    echo "==== Stop"

    if [ -f $PID ]
    then
        if kill $( cat $PID )
        then echo "Done."
             echo "$(date '+%Y-%m-%d %X'): STOP" >>$LOG
        fi
        /bin/rm $PID
        kill_cmd
    else
        echo "No pid file. Already stopped?"
    fi
}

case "$1" in
    'start')
            start
            ;;
    'stop')
            stop
            ;;
    'restart')
            stop ; echo "Sleeping..."; sleep 1 ;
            start
            ;;
    'status')
            status
            ;;
    *)
            echo
            echo "Usage: $0 { start | stop | restart | status }"
            echo
            exit 1
            ;;
esac

exit 0

 

2. 쉘 스크립트 실행하기

실행방법은 ./shell.sh 명령뒤에 start, stop, restart, status를 붙이면 됩니다.

[root@localhost tunnel.server]# ./tunnel.sh start
Started...

[root@localhost tunnel.server]# ./tunnel.sh restart
Stoped....

Killing  17959
Sleeping...
Started...

[root@localhost tunnel.server]# ./tunnel.sh status
Pid file: 17626 [/var/run/tunnel.pid]
root     17626     1  0 09:40 ?        00:00:11 java -classpath /root/tunnel.server/.......

[root@localhost tunnel.server]# ./tunnel.sh stop
Stoped....

Killing  17626

Killing -9 17829

 

참고자료

start_stop_memcached_script.sh

gist.github.com/tinogomes/447191/f751239eb48e3341b18a79b11995cee7978ee77b

728x90