Linux 에서 Tomcat 재시작 하는 스크립트

테스트 서버에서 구성해 둔 Tomcat을 재기동할 때마다 일일히 shutdown 시키고, startup 하는게 귀찮아서 한방에 재시작할 수 있도록 restart.sh를 만들어 봤다.
기존의 startup.sh와 shutdown.sh가 있는 상태에서 작동한다.

#!/bin/bash
export LANG=ko_KR.UTF-8

## 이곳에 각자 경로를 넣어주면 됨
C_HOME=/usr/local/tomcat7
C_PATH=$C_HOME/bin
C_LOG=$C_HOME/logs

#echo $C_HOME
#echo $C_PATH
#echo $C_LOG

## FUNCTION WAIT FOR 5 SECS
function stanby() {
  # full bar, e.g. 20 chars
  BAR='####################'
  VAC='                    '

  for i in {1..20}; do
    # waited sec
    var=`echo "0.25*$i"|bc`
    # print $i chars of $BAR from 0 position && from $i to 20
    echo -ne "\r>> STANBY [${BAR:0:$i}${VAC:$i:20}] $var sec << "
    # wait 250ms between "frames"
    sleep .25
  done
  echo -ne "\n"
}

### CHECK IS SERVER ALIVE
function isAlive() {
  if [ -z "`ps -eaf | grep java | grep $C_PATH`" ]; then
    # END
    echo 0
  else
    # RUN
    echo 1
  fi
}


echo -e "\n\n\t\t !!>> RESTART.SH RUN `date +%Y-%m-%d' '%H:%M:%S` <<!!\n\n" >> $C_LOG/catalina.out

## RUN SHUTDOWN.SH
echo -e "\nShutdown tomcat now...\n"
bash $C_PATH/shutdown.sh

stanby

## CHECK THE PROCESS ENDED
if [ isAlive == 0 ]; then
  echo -e "\n\t>>> Tomcat was terminated successfully. <<<\n"
else
  ## IF IT HAS NOT ENDED KILL PROCESS
  ps -eaf | grep java | grep $C_PATH | awk '{print $2}' |
  while read PID
  do
    echo "Killing $PID... "
    kill -9 $PID
    echo -e "Tomcat($PID) is being killed\n"
  done

  stanby
fi

echo -e "\n\t>>> try to restart tomcat now <<<\n"

## RUN STARTUP.SH
bash $C_PATH/startup.sh

if [ isAlive == 0 ]; then
  echo -e "\n\t>>> ERROR!!! CAN NOT START TOMCAT!!  <<<"
else
  ## IF IS PROCESS RUN, CHECK USER WANNA TAIL LOG
  echo -e "\n\t>>> TOMCAT STARTUP COMMAND IS ON ACTION. <<<"
  echo -en "tail log?? (y|n) : "
  read yn

  ## TAIL LOG
  if [ $yn == "y" ] || [ $yn == "Y" ]; then
    # **CHECK DIR**
    tail -f $C_LOG/catalina.out
  fi
fi

프로세스 확인하는 함수를 따로 빼 두거나,
startup이나 shutdown의 경로를 따로 변수로 잡아주면 좋을것 같지만 일단 킵해두도록 함.

추가적으로 서버 기동 후 로그를 보는 명령어도 귀찮아서 shell 파일로 만들어 봤다.

    #!/bin/bash
    export LANG=ko_KR.UTF-8

    tail -f ../logs/catalina.out
728x90
반응형

쉘 스크립트 - 2

  • 학습 개요
    쉘 스크립트에서 선택과 반복을 위한 제어 구조를 사용해보자.
    선택 구조인 if / case, 반복 주조인 for / while / until 명령의 문법과 의미를 알아 보자.
    조건 검사가 필요할 때 사용되는 명령과 수식의 작성법을 알아 보자.

  • 학습 목표

    1. 선택 구조를 사용하여 쉘 스크립트를 작성하자.
    2. 반복 구조를 사용하여 쉘 스크립트를 작성하자.
    3. 수식을 포함하는 쉘 명령을 선택과 반복 구조에서 사용하자.

선택 구조

제어 구조

  • 쉘 스크립트에서 실행을 제어하기 위해 선택과 반복 구조를 사용함.
  • if, for, case, while, until

if

  • 프로그래밍 언어에서 if 문의 기능

if command ...; then
  command ...
[ elif command; then
  command ... ]...
[ else
  command ... ]
fi
  • ;은 같은 라인에서 다른 단어(then elif else fi)와 구분이 필요할 때 사용함.
  • if다음의 명령을 실행하여 참이면 then 다음의 명령을 실행함. (if 명령은 종료됨)
    • if나 elif 다음에 조건 검사를 위한 test 명령을 사용할 수 있음.
    • if나 elif 다음에 나오는 마지막 명령의 종료 상탯값으로 참과 거짓을 구분함.
    • 종료 상탯값 0은 성공적 종료를 의미하며 참으로 간주.
  • 거짓이면 elif 다음의 명령을 실행하여 참 / 거짓을 판단하고 실행함.
  • 만족 되는 것이 없으면 else 다음의 명령을 실행함.
  [ec2-user@ip-AWS ~]$ cd /usr/bin
  [ec2-user@ip-AWS bin]$ echo $?
  0
  [ec2-user@ip-AWS bin]$ cd /bin/usr
  -bash: cd: /bin/usr: No such file or directory
  [ec2-user@ip-AWS bin]$ echo $?
  1
  [ec2-user@ip-AWS bin]$ if true; then
  > echo "SUCCESS"
  > else
  > echo "FAILURE"
  > fi
  SUCCESS
  [ec2-user@ip-AWS bin]$ if true; false; then
  > echo "TRUE"
  > fi

test

  • 조건 검사를 위해 사용하는 명령
  • 조건이 만족되면 종료 상탯값으로 0(true), 1(false)를 리턴함
  • test expression || [ expression ]
    • expression은 파일의 상태 검사, 문자열의 비교, 정수 비교를 위한 수식
    • **대괄호와 expression 사이에 공백이 있어야 함.
[ec2-user@ip-AWS ~]$ cat intCompare.sh
#! /bin/bash
if [ $# !=2 ]; then
        echo "you must supply two numbers as arguments"
        exit 1
fi

if [ $1 -eq $2 ]; then
        echo "$1 equals to $2"
elif [ $1 -gt $2 ]; then
        echo "$1 is greater than $2."
else
        echo "$1 is less than $2."
fi

echo "$1 + $2는 $[$1+$2]임."

[ec2-user@ip-AWS ~]$ chmod u+x intCompare.sh

[ec2-user@ip-AWS ~]$ ./intCompare.sh 36 68
./intCompare.sh: line 2: [: 2: unary operator expected
36 is less than 68.
36 + 68는 104임.

case

  • 다중 선택을 지원하는 복합 명령
    • switch 문과 비슷
case word in
  [ pattern [ | pattern ]... ) command...;; ]...
esac
  • word 부분을 먼저 확장하고 pattern과 매칭되는지 검사함
  • 매칭이 이루어지면 상응하는 명령이 수행됨
  • 일단 매칭이 이루어지면 이후의 매칭 시도는 없음
  • pattern에서 *은 프로그래밍에서 'default 키워드'를 사용함.

case에서 패턴 사용 예

pattern ) desc (word가 다음과 같은 경우 패턴 매칭이 일어남)
a) a인 경우
[[:alpha:]]) 1개의 알파벳 문자인 경우
???) 임의의 세 글자인 경우
*.txt .txt로 끝나는 경우
[aeiou]) 모음에 해당하는 영문 소문자 1개인 경우
[ABE][0-9] 앞 글자가 A, B, E중 하나이고 다음 글자가 숫자인 두 글자인 경우
*) 임의 길이의 글자와 매칭됨. case 명령에서 마지막 패턴으로 사용하는 것이 좋음

case 실행의 예

[ec2-user@ip-AWS ~]$ cat caseTest.sh
#!/bin/bash

echo "
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit
"

read -p "Enter selection [a, b, c or q] > "

case $REPLY in
  a|A)
      echo "Hostname : $HOSTNAME"
      uptime
      ;;
  b|B)
      df -h
      ;;
  c|C)
      if [$( id -u) -eq 0 ]; then
        echo "All user's home disk space utillization"
        du -sh /home/*
      else
        echo "($USER)' home disk space utilization"
        du -sh $HOME
      fi
      ;;
  q|Q)
      echo "Program terminated."
      exit
      ;;
  *)
      echo "Invalid entry" > $2
      exit 1
      ;;
esac

[ec2-user@ip-AWS ~]$ ./caseTest.sh
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit

Enter selection [a, b, c or q] > a
Hostname : ip-AWS.ap-northeast-2.compute.internal
07:45:43 up 34 days, 0 min,  1 user,  load average: 0.00, 0.00, 0.00


[ec2-user@ip-AWS ~]$ ./caseTest.sh
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit

Enter selection [a, b, c or q] > b
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        474M     0  474M   0% /dev
tmpfs           492M     0  492M   0% /dev/shm
tmpfs           492M  408K  492M   1% /run
tmpfs           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1      8.0G  1.9G  6.2G  24% /
tmpfs            99M     0   99M   0% /run/user/1000

[ec2-user@ip-AWS ~]$ ./caseTest.sh
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit

Enter selection [a, b, c or q] > c
./caseTest.sh: line 19: [1000: command not found
(ec2-user) home disk space utilization
92K     /home/ec2-user

[ec2-user@ip-AWS ~]$ ./caseTest.sh
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit

Enter selection [a, b, c or q] > d
./caseTest.sh: line 30: $2: ambiguous redirect

[ec2-user@ip-AWS ~]$ ./caseTest.sh
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit

Enter selection [a, b, c or q] > g
./caseTest.sh: line 30: $2: ambiguous redirect

[ec2-user@ip-AWS ~]$ ./caseTest.sh
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit

Enter selection [a, b, c or q] > q
Program terminated.

반복 구조

for

  • 모든 데이터를 한 차례씩 처리하는 제어구조
  •   for variable [ in word ... ]; do
        command ...
      done
  • word ... 부분 (값의 목록)을 먼저 확장함
  • word 목록에 존재하는 값을 순차적으로 변수 variable에 대입하고 do와 done 사이의 명령을 수행함.
  • word 부분이 없다면 in "$@"가 있는 것으로 가정함.
  [ec2-user@ip-AWS ~]$ echo {A..D}
  A B C D
  [ec2-user@ip-AWS ~]$ for i in {A..D}; do echo $i; done
  A
  B
  C
  D
  [ec2-user@ip-AWS ~]$ cat testFor.sh
  #! /bin/bash
  for FILE
  do
    echo $FILE
  done

  [ec2-user@ip-AWS ~]$ chmod u+x testFor.sh

  [ec2-user@ip-AWS ~]$ ./testFor.sh `ls`
  arg.sh
  caseTest.sh
  first.sh
  intCompare.sh
  list.bak
  testFor.sh
  whoson.sh
  • C나 Java에서 사용하는 형태

  •   for (( exp1; exp2; exp3 )); do
        command...
      done
  • exp1~3은 수식으로 각각 생략 가능

  • exp1은 제어 변수의 초기화를 위해 한 번 수행 됨

  • exp2가 참인 동안 명령과 exp3이 반복 수행 됨

  • [ec2-user@ip-AWS ~]$ cat testFor3.sh
      #! /bin/bash
      LIMIT=10
    
      for(( a=0; a<LIMIT; a++)); do
        echo "$a"
      done
      [ec2-user@ip-AWS ~]$ . testFor3.sh
      0
      1
      2
      3
      4
      5
      6
      7
      8
      9
      [ec2-user@ip-AWS ~]$

while

  • 조건이 참인 동안 명령을 반복함.
  •   while command...; do
        command
      done
  • while 다음에 나오는 명령을 실행하여 참 또는 거짓을 판단함
  • if 명령과 마찬가지로 종료 상탯값이 0이면 참으로 판단
  • 조건 비교를 위해 test expression 또는 [ expression ]을 자주 사용함.
  [ec2-user@ip-AWS ~]$ cat testWhile.sh
  #! /bin/bash
  N=1
  S=0

  while [ $N -le 10 ]; do
    echo -n "$N "
    S=$[ $S+$N ]
    N=$[ $N+1 ]
  done
  echo
  echo $S
  [ec2-user@ip-AWS ~]$ . testWhile.sh
  1 2 3 4 5 6 7 8 9 10
  55

for 와 while

  • for 명령 (2)를 다음과 같이 변환 가능
  •   (( exp1 ))
      while (( exp2 )); do
        command...
        (( exp3 ))
      done
  • (( expression ))은 수식 계산에 사용되는 복합 명령
  • let "expression"과 동일하며 test 명령 대신에 사용 가능
    • 조건 비교를 위해 test expression 또는 [ expression ]과 함께 자주 사용함.
  • while 다음의 (( expression ))에서 수식 결과가 0이 아닌 경우 종료 상탯값이 0이 되며 참으로 판단.
  [ec2-user@ip-AWS ~]$ cat testWhile2.sh
  #! /bin/bash
  LIMIT=10

  ((a=0))
  while (( a<LIMIT )); do
    echo "$a"
    (( a++ ))
  done
  [ec2-user@ip-AWS ~]$ . testWhile2.sh
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9

until

  • 조건이 만족될 때까지(거짓인 동안) 명령을 반복하여 수행함
  •   until command ... ; do
        command ...
      done
  • until 다음에 나오는 명령이 참이 될 때까지 반복함
    • 거짓인 동안 반복하게 됨
  • 조건을 표시하기 위해 test expression, [ expression ], (( expression ))을 사용할 수 있음.
  [ec2-user@ip-AWS ~]$ cat testUntil.sh
  #! /bin/bash
  N=1
  S=0
  until [ $N -gt 10 ]; do
    echo -n "$N "
    let S=$S+$N
    let N=$N+1
  done
  echo
  echo $S
  [ec2-user@ip-AWS ~]$ . testUntil.sh
  1 2 3 4 5 6 7 8 9 10
  55
728x90
반응형

'OS > Linux' 카테고리의 다른 글

[Linux] 원격 관리  (0) 2020.12.13
[Linnux] 네트워크 설정 및 점검  (0) 2020.12.05
[Linux] 소프트웨어 관리  (0) 2020.11.01
[Linux] 프로세스 관리  (0) 2020.11.01
[Linux] 파일 시스템 관리  (0) 2020.10.25

+ Recent posts