레이블이 shell scripts인 게시물을 표시합니다. 모든 게시물 표시
레이블이 shell scripts인 게시물을 표시합니다. 모든 게시물 표시

2019년 9월 3일 화요일

bash script + expect script 연결 스크립트

bash 와 expect는 문법도 다르고 방식도 다르다.

bash 는 스크립트 기반으로 명령을 실행한다면 expect의 경우에는 리모트 서버에 접속하여prompt를 통해서 명령을 실행 할 수 있다.
예를 들면 ssh를 통해서 명령어를 실행할 경우 

bash: ssh 계정@서버:명령어
expect: ssh 계정@서버 접속 후 prompt에서 명령어 실행 후 exit

이번에 bash 와 expect를 동시에 사용하기 위해서 스크립트를 만들었다.

#!/bin/bash

DEPLOY_BASE=/home/ansible/expect
DOMAIN="$1"
SERVICE="$2"

LIST="$DOMAIN"_"$SERVICE"_serverlist
USER=root
PASSWD=root

if [ -e "$LIST" ]; then
  for hostip in `cat $DEPLOY_BASE/$LIST`; do
  echo -e "\\n able to connect $hostip \\n"


# 여기서 부터 expect 를 실행한다. EOF는 end of file
expect << EOF
  spawn ssh -o StrictHostKeyChecking=no $USER@$hostip
  expect -re "password:"
  send "$PASSWD\r"

  expect -re "Last login:"
  send "exit \r"


# expect  종료.
EOF

  done
else
  echo -e "\\n # [ERROR] Can not found $LIST file \\n"
fi


단순 ssh 접속 테스트를 하기 위한 스크립트 이고 serverlist 파일에는 접속하려는 ip가 있어야 한다. 

이 스크립트 기반으로 응용하면 다른 명령어들도 실행이 가능하다.








2019년 8월 6일 화요일

Apache web 다운로드 스크립트

 Apache web 서버를 설치 하기 위해선 먼저 설치 파일을 다운로드한다.
pc에서 다운받은 후 FTP를 이용해 파일을 업로드 할 수 있지만 웹이 연결된 서버내에서는 OS command를 통해서 파일을 다운로드 받을 수 있다.
 다운로드 후 archive 파일을 unarchive 파일까지 실행하는 스크립트를 작성하였다.

스크립트에 내용을 보면 명령어 실행 후 $? 변수의 경우 성공과 실패를 체크한다.
0 성공, 0이 아닌 경우 실패


#!/bin/bash

DIR=$(pwd)
# VERSION은 마이너버전까지 필수로 입력
VERSION=2.4.39
INSTALL_FILE="httpd-$VERSION.tar.gz"
INSTALL_DIR="$DIR/installFiles"
# 다운로드 받는 미러 사이트 url을 넣었고 version을 변수로 사용
GET_URL="http://archive.apache.org/dist/httpd/$INSTALL_FILE"

# 설치 파일을 두는 경로이고 없으면 만듬
[ ! -d "$INSTALL_DIR" ] && mkdir -p "$INSTALL_DIR";





# FTP로 업로드 했을 경우에 파일을 찾아서 압축을 해제
ARCH_FILE=`find $DIR -type f | grep "$INSTALL_FILE$"`
find_rs=$?
if [ "$find_rs" -eq "0" ]; then
# tar 로 압축된 archive 파일을 압축 해제
  tar xfz "$ARCH_FILE" -C "$DIR"
  echo -e "# [INFO] apache install file is $INSTALL_FILE \\n"
  else
# 설치 파일이 없는 경우 웹에서 다운받음
  wget "$GET_URL" -P "$INSTALL_DIR"
  wget_rs=$?

# tar 로 압축된 archive 파일을 압축 해제
  tar xfz "$INSTALL_DIR/$INSTALL_FILE"
  tar_rs=$?
# wget과 tar가 실패 했을 경우 ERROR로 판단
  if [ "$wget_rs" -eq "0" ] && [ "$tar_rs" -eq "0" ]; then
    echo -e "# [INFO] apache-$VERSION download successed \\n"
  else
    echo -e "# [ERROR] There was problems during download(or unarchive) apache-$VERSION \\n"
    exit 1;
  fi 
fi

2019년 7월 17일 수요일

apache httpd 서버 설치 스크립트

오픈소스 중 가장 많이 쓰는 웹서버 apache httpd server 를 설치 스크립트로 작성해 보았다.
httpd 설치는 두가지 방법이 있다. 패키지 설치, 소스컴파일!!
소스컴파일에 대한 스크립트이다. (패키지 설치는 너무 쉬움 yum install httpd -y) 

httpd 설치는 compile 제외하곤 그리 어렵지 않다.(사실 컴파일도 그렇게 어렵지 않다) 그래도 매번 반복되는 작업을 하지 않기 위해 스크립트를 만들어보았고, 만들면서.. 과연 이게 필요할까도 생각 했지만...끝은 내고 싶었기에 완성 하였다

최초 설치에 앞서 root 또는 sudo 권한이 있는 계정으로 필수 패키지를 설치 해야한다.
centos 기반으로 만들었고 최초 vm 생성한 후 컴파일 해가며 필요한 패키지를 찾았다.

#!/bin/bash

# root or sudo permission
# Required package
array=(apr-devel apr-util-devel openssl-devel pcre-devel)



# 반복문을 통해서 패키지를 하나씩 설치 한다.
for pkg in "${array[@]}"
do
  yum list $pkg > /dev/null
  if [ $? -eq 0 ];  then
    sudo yum install $pkg -y
  else
    echo "# [ERROR] $pkg not found or unknown name "
  fi
done



DIR=$(pwd)
# 설치 할 configure 파일 찾음
CONFIG=`find $DIR -type f -name "configure"`
# configure 파일경로 찾음
CONFIG_DIR=$(dirname $CONFIG)

# httpd server 를 설치할 디렉토리(prefix라함), 이미 환경변수(PREFIX)에 경로를 설정했으면 yes or no 물어본 후 설치가 진행됨
PREFIX=
echo "# PREFIX=$PREFIX"
# 환경변수(PREFIX)가 설정되지 않았음 프롬프트에서 받아서 처리
if [ -z $PREFIX ]; then
  echo -n "# Input PREFIX (install directory): ";
  read prefix;
# 입력이 없으면 에러 발생
  if [ -z $prefix ]; then
    echo ""
    echo "# [ERROR] Please input(prefix) it correctly!!! "
    echo ""
    exit ;
  fi
  PREFIX=$prefix
else
# 당연히 PREFIX 디렉토리는 없을 거고 웹서버가 설치 되면서 경로를 만들 것임, 하지만 이구분은 PREFIX 를 제대로 입력하였는지 확인 하는 용도
  if [ ! -d $PREFIX ]; then
    echo "# [INFO] PREFIX($PREFIX) will be created directory! automatically "
    echo ""
# 설치 진행 할 경우 yes, y 를 입력! 설치를 원치 않으면 no, n를 입력하는데 잘못 입력할 것을 대비해서 while 과 case를 써서 정확한 입력을 받음

    while true; do
      read -p  "# Do you want to install httpd server continue? (yes or no) " yn
      case $yn in
        [Yy]* ) echo "# [INFO] You entered YES"; echo "";
# 일반적으로 설치 할경우 설치파일 경로로 가서 configure, options로 설치한다. options은 크게 중요하지 않음
        cd $CONFIG_DIR;
        ./configure --prefix=$PREFIX --with-mpm=worker --enable-modules=most \
                    --enable-mods-shared=most --enable-cache --enable-file-cache \
                    --enable-so --enable-mime-magic --enable-expires --enable-header \
                    --enable-proxy --enable-ssl --enable-https --enable-mpms-shared=all \
                    --enable-vhosts-alias --enable-rewrite \

        make && make install;
        break;;

# 설치 진행 대답을 no로 했을 경우 그냥 빠져 나옴!
        [Nn]* ) echo "# [INFO] You entered NO";  echo ""; exit;;
        * ) echo "##################################";   
            echo "# [WARN] Please answer Yes or No #";   
            echo "##################################";;
      esac
    done
  fi
fi

2019년 7월 12일 금요일

java thread dump 스크립트

java process 가 서비스를 수행 중 느려지거나, 아무런 동작하지 않을 때(locked) 현재 그 java process 상태를 확인 하기 위해서 thread dump를 많이 사용한다. 
thread dump를 남기는 방법은 두가지가 있다.

kill -3 or jstack command를 사용할 수 있는데,

kill -3 은 stdout 파일 예를들면 catalina.out 파일에 dump를 남기고
jstack의 경우에는 console 화면에 보여진다. 
console 보여진다는 의미는 jstack $PID 를 실행하였을 시에 모니터 화면에 바로 볼 수있다. 

thread dump 를 생성하는 방법은 동일하지만, 로그 내용을 쓰는데는 방식이 다르다.

catalina.out을 통해서 보는것도 좋지만, vi에서 화면을 오르랄 내리락 해야하기 때문에 jstack을 통해서 thread dump 내용을 파일로 리다이렉션 하는 것이 좀더 편해 보인다. 

jstack으로 thread dump를 생성하는 것을 bash scripts 로 만들었다. 

#!/bin/bash

export CATALINA_BASE=$(dirname $(dirname $(realpath $0)))
. $CATALINA_BASE/bin/env.sh > /dev/null

DATE=`date +%Y-%m-%d`

# 2초에 한번씩 총 5번 thread dump를 생성
for count in 1 2 3 4 5; do
    echo "# Thread Dump : $count"
    for i in `ps -ef | grep java | grep "$SERVER_NAME " | awk '{print $2}'`;do
echo "# PID [$i] jstack is running "
$JAVA_HOME/bin/jstack -l $i >  $LOG_DIR/threaddump.$DATE
echo "# sleep 2 sec"
sleep 2;
    done
    echo "done"
    sleep 3
done
echo ""
# thread dump 로그파일을 남김
echo "# Dumpfile is  $LOG_DIR/threaddump.$DATE"
echo ""

2019년 7월 10일 수요일

Tomcat 기동 시 CLOSE_WAIT으로 인해 startup 이 안되는 경우

jvm 경우 프로세스를 강제종료(kill) 하면 모든 스레드도 종료된다.

하지만 특이한 경우 프로세스를 강제종료(kill) 했음에도 불구하고, 종료되지 않은 경우가 있는데 이를 확인하기 위해 netstat 으로 톰켓 포트를 확인 해 봤을 시에 해당 포트가 CLOSE_WAIT이 걸리면서 기동을 하려고 했을 때 아래와 같은 메시지가 발생할 수 있다.

SEVERE [main] org.apache.catalina.core.StandardServer.await StandardServer.await: create[localhost:8005]:
        java.net.BindException: Address already in use (Bind failed)


이런 경우에 정말 깔끔하게 톰캣 프로세스를 종료 하는 스크립트를 만들어 봤다.
 

#!/bin/bash

export CATALINA_BASE=$(dirname $(dirname $(realpath $0)))
. $CATALINA_BASE/bin/env.sh > /dev/null


# 프로세스 id 찾은 후 변수 처리
PID=`ps -ef | grep java | grep "=$SERVER_NAME" | awk '{print $2}'`

# 현재 서비스 중이 포트를 찾아서 변수 처리 (명령어 종류는 많음)
HTTP_PORT=$CATALINA_BASE/bin/env.sh  | grep HTTP_PORT


# waitng 이 걸린 connection을 찾은 후 변수 처리 cconnection 수가 많기 때문에 반복문 사용 
for NETSTAT in `netstat -anp 2>/dev/null | grep $HTTP_PORT | awk '{print $4}'`;
do
    echo "$NETSTAT"
done


if [ $NETSTAT != 0 ]; then

# fuser 명령어를 통해서 모든 커넥션 정리
  fuser -kvn tcp ${HTTP_PORT};


# 명령어가 없을 수도 있으니 명령어가 실행 되었는지 확인 0=true not 0=false
  if [ $? != 0 ]; then
    echo "[ERROR] Have to install psmisc (ex) yum install psmisc -y"
    exit;
  fi
  sleep 2;
  else
    echo "### Tomcat is Not Runnable ## "
    echo ""
    exit;
fi

현재 구성한 서버 환경에서는 잘 동작한다.












2019년 7월 4일 목요일

Tomcat start.sh 스크립트

 Tomcat instance 구성한 후 번들로 제공되는 Tomcat home에 있는 startup.sh 맘에 들지 않을 뿐더러 기능이 적다.

기존에 갖고 있던 스크립트에서 update 했다


#!/bin/bash

export CATALINA_BASE=$(dirname $(dirname $(realpath $0)))  # 절대경로를 설정(상대 경로의 경우 스크립트 실행 시 cd 를 넣어 주어야 함)

. $CATALINA_BASE/bin/env.sh >> /dev/null # 환경변수 적용

DATE=`date +%Y%m%d%H%M%S`

# Process Check ---------------------------------------
PID=`ps -ef | grep java | grep "=$SERVER_NAME" | awk '{print $2}'`

if [ e$PID != "e" ]; then
  echo "# [ERROR] Tomcat ($SERVER_NAME) is already RUNNING..."
  exit;
fi
# WAS User Check----------------------------------------
UNAME=`id -u -n`
if [ e$UNAME != "e$TOMCAT_USER" ]; then
  echo "# [ERROR] $TOMCAT_USER USER to start this SERVER! - $SERVER_NAME..."
  exit;
fi

# Make LOG Directory------------------------------------
# 로그홈 설정이 없으면 또는 권한이 없는 경우 바로 exit!!
if [ -z $LOGHOME ]; then
  echo "# [ERROR] $LOGHOME/$SERVER_NAME No Such Directory or Permission denied!!! Please check $CATALINA_BASE/bin/env.sh file "
  echo ""
  exit ;
else
  [ ! -d "${LOG_DIR}" ]      &&  mkdir -p "${LOG_DIR}";     
  [ ! -d "${ACCESS_DIR}" ]   &&  mkdir -p "${ACCESS_DIR}"; 
  [ ! -d "${GC_LOG_DIR}" ]   &&  mkdir -p "${GC_LOG_DIR}";
  [ ! -d "${HEAP_LOG_DIR}" ] &&  mkdir -p "${HEAP_LOG_DIR}";
fi

# -------------------------------------------------------
# rotate 기능이 필요 없을 때 
# -------------------------------------------------------
rm -rf $CATALINA_BASE/work/*;
mv ${LOG_DIR}/$SERVER_NAME.log ${LOG_DIR}/$SERVER_NAME.$DATE;

nohup $CATALINA_HOME/bin/catalina.sh run >> ${LOG_DIR}/$SERVER_NAME.log 2>&1 &
# -------------------------------------------------------

# rotate 기능이 필요한 경우 (하지만 logrotate 기능이 더 안전함) 경험상 rotatelogs는 비정적으로 프로세스가 죽는다. 아무런 흔적없이.......
# -------------------------------------------------------
mv $LOG_DIR/$SERVER_NAME.log.`date '+%Y-%m-%d'` $LOG_DIR/$SERVER_NAME.log.$DATE;

nohup $CATALINA_HOME/bin/catalina.sh run 2>&1 |/usr/sbin/rotatelogs -l $LOG_DIR/$SERVER_NAME.log.%Y-%m-%d 86400 &


# ------------------------------------------------------
# Do not want to log stdout, stderr (ex ./start.sh nolog)
# tail을 통해서 로그가 올라오는 것을 보고 싶을 수도 있지만 그렇지 않은 경우엔 인자값을 nolog 또는 notail을 입력하면 tail 없이 기동
# ------------------------------------------------------
if [ "$1" == "nolog" ] || [ "$1" == "notail" ] ; then
  echo "Starting... $SERVER_NAME"
  exit;
fi

# -----------------------------------------------------
$CATALINA_BASE/bin/tail.sh

2019년 7월 3일 수요일

Tomcat multi instance 구성 준비 (shell script) update version

이전 포스트에서 작성한게 있는데 아무리 봐도 아쉬운 부분이 많았다.
그래서 맘잡고 업데이트를 하였다. 
소스는 최대한 적게 작성하려고 했지만, 이정도가 적당한지 모르겠다.

#!/bin/bash

VERSION=8.5              # (필수)버전을 선택
DIR=$(pwd)               
INSTANCE_NAME=       # 인스턴스 생성시 확인 해야할 이름이 필요
LOGHOME=/logs/tomcat

if [ -z $INSTANCE_NAME ]; then  # 인스턴스명을 프롬프트로 받을 수 있음
  echo -n "Input unique INSTANCE_NAME(or SERVER_NAME) (ex tomcat-svr-11, tomcat-11): ";
  read word;
  if [ -z $word ]; then
    echo "# [ERROR]  have to Input INSTANCE_NAME(or SERVER_NAME)!!! "
    exit ;
  fi
    INSTANCE_NAME="$word";
    SVR_NAME=$INSTANCE_NAME;
    SVR_PATH=$DIR/$SVR_NAME;
    echo "INSTANCE_NAME = $SVR_NAME";
    echo "INSTANCE_PATH = $SVR_PATH";
    `mkdir -p $SVR_PATH`;    # 인스턴스명을 지정했다면 이제 directory 생성
  else
    SVR_PATH=$DIR/$INSTANCE_NAME;
    `mkdir -p $SVR_PATH`;
fi

if [ ! -z $LOGHOME ]; then   # 심볼릭 링크를 걸고 싶다면 위쪽 LOGHOME을 지정
  `ln -s $LOGHOME $DIR/$INSTANCE_NAME/logs`
fi

# -----------------------------------------------------------------
# Make Directory # 로그 경로들을 생성
# -----------------------------------------------------------------
[ ! -d "$INSTANCE_NAME/bin" ]     &&  mkdir -p $INSTANCE_NAME/bin;
[ ! -d "$INSTANCE_NAME/conf" ]    &&  mkdir -p $INSTANCE_NAME/conf;
[ ! -d "$INSTANCE_NAME/lib" ]     &&  mkdir -p $INSTANCE_NAME/lib;
[ ! -d "$INSTANCE_NAME/temp" ]    &&  mkdir -p $INSTANCE_NAME/temp;
[ ! -d "$INSTANCE_NAME/webapps" ] &&  mkdir -p $INSTANCE_NAME/webapps;
[ ! -d "$INSTANCE_NAME/work" ]    &&  mkdir -p $INSTANCE_NAME/work;

# -----------------------------------------------------------------
# XML Copy # tomcat 엔진이 설치 되어 있는지 확인 없으면 설치 해야함
# -----------------------------------------------------------------

value=`find ../ -type f -name "catalina.sh" 2>/dev/null | wc -l`
#echo $value

if [ -z ${value} ]; then
  echo "# [ERROR] Can not Found Tomcat Engine"
  else
  if [ ! -d $CATALINA_HOME ]; then
    echo "# [ERROR] Can not find CATALINA_HOME"
  else
    CATALINA_HOME=$(find ../ -type d -name "*$VERSION*" 2>/dev/null -exec readlink -f {} \;)
    cp -r $CATALINA_HOME/conf/* $SVR_PATH/conf/;
  fi
fi

# -----------------------------------------------------------------
# PORT, jvmRoute Translation # 경로하고 설정파일만 복사한다고 끝이 아니다 바로 기동하면 포트가 쫑(충돌)난다. 아마 address already use 라고 나올 것 같다. 
java system properties로 설정하기 위해 문자 치환
혹시 세션 클러스터 사용시 필요할 jvmRoute도 설정
# -----------------------------------------------------------------
DIFF=$(diff $CATALINA_HOME/conf/server.xml $SVR_PATH/conf/server.xml)
if [ "$DIFF" ]; then

  echo "# [WARNING] $CATALINA_HOME/conf/server.xml and $SVR_PATH/conf/server.xml are different "
else
  sed -i 's/8005/\$\{shutdown.port\}/' $SVR_PATH/conf/server.xml;
  sed -i 's/8080/\$\{http.port\}/' $SVR_PATH/conf/server.xml;
  sed -i 's/8009/\$\{ajp.port\}/' $SVR_PATH/conf/server.xml;
  sed -i 's/8443/\$\{ssl.port\}/' $SVR_PATH/conf/server.xml;
  sed -i 's/8443/\$\{ssl.port\}/' $SVR_PATH/conf/server.xml;
  sed -i 's/"localhost">/"localhost" jvmRoute="${server}">/' $SVR_PATH/conf/server.xml;
fi

2019년 7월 1일 월요일

centos tomcat multi instance 구성 준비 (shell script)


리눅스(centos 기준)서버 한대에 tomcat 인스턴스를 여러개 구성이 필요할 경우
이를 tomcat multi instances(?)라고 하는 것 같다.

tomcat을 multi instances 구성을 하려면 디렉토리도 생성해줘야 하고 scripts, xml 파일 등등 복사해와야 한다.

수작업이 시간이 오래 걸리고 error도 많기 때문에 스크립트로 만들어봤다.

#!/bin/bash

# -----------------------------------------------------------------
# Make Directory (필수 디렉토리 생성)
# -----------------------------------------------------------------
if [ ! -d ./bin ]
    then
    echo "create bin directory."
    mkdir -p ./bin;
fi

if [ ! -d ./conf ]
    then
    echo "create conf directory."
    mkdir -p ./conf;
fi

if [ ! -d ./lib ]
    then
    echo "create lib directory."
    mkdir -p ./lib;
fi


if [ ! -d ./temp ]
    then
    echo "create temp directory."
    mkdir -p ./temp;
fi

if [ ! -d ./webapps ]
    then
    echo "create webapps directory."
    mkdir -p ./webapps;
fi

if [ ! -d ./work ]
    then
    echo "create work directory."
    mkdir -p ./work;
fi

# -----------------------------------------------------------------
# XML Copy (CATALINA_HOME 톰캣엔진에서 xml을 copy)
# -----------------------------------------------------------------
# catalina.sh 파일은 tomcat을 실행하기 위한 필요한 스크립트이기 때문에 이 script 기준으로 설정
value=`find ../../ -type f -name "catalina.sh" 2>/dev/null | wc -l`
#echo $value

if [ ${value} -ne 1 ];
    then
        echo "Can not Found Tomcat Engine"
    else

    if [ ! -d $CATALINA_HOME ]
        then
            echo "Can not find CATALINA_HOME"
        else
        CATALINA_HOME=$(find ../../ -type d -name "*8.5*" 2>/dev/null -exec readlink -f {} \;)
            cp -r $CATALINA_HOME/conf/* ./conf;

        fi

fi

# 기존 port 또는 기본 port 와의 충돌을 피하기 위해서 system properties로 넘길 것 (JAVA_OPTS -D option)
# -----------------------------------------------------------------
# PORT Translation
# -----------------------------------------------------------------
find . -type f -name "server.xml" -exec sed -i "s/8005/\$\{shutdown.port\}/" {} \;
find . -type f -name "server.xml" -exec sed -i "s/8080/\$\{http.port\}/" {} \;
find . -type f -name "server.xml" -exec sed -i "s/8009/\$\{ajp.port\}/" {} \;
find . -type f -name "server.xml" -exec sed -i "s/8443/\$\{ssl.port\}/" {} \;

# -----------------------------------------------------------------
# jvmRoute
# -----------------------------------------------------------------
find . -type f -name "server.xml" -exec sed -i "s/defaultHost=\"localhost\"/defaultHost=\"localhost\" jvmRoute=\"\$\{server\}\"/" {} \;

2019년 6월 25일 화요일

shell script 자동 배포 (auto deploy)

목적
1. 첫 번째(이하 배포서버) 서버에 배포를 한 후 순차적으로 늘어나는 서버에들에 대해서는 자동 배포
2. 자동 배포하였을 시에 ip 기반으로 순차적으로 늘어 난다는 가정
3. 배포 완료 후 재기동 까지 해야 정상 처리

아래에 스크립트를 보면 복잡해 보이지만 그렇지 않다. (단순 tomcat deploy)
단순히 배포 서버에 디플로이가 정상이 되면 그 이후부터는 ping테스트하여 복제되는 서버에 대해서는 자동으로 배포 후 끝나는 것이 목표 였다.

주석을 쉬운 영어로 표기 했으니 이정도면 이해가 어렵진 않을 것 같다. 


#/bin/bash

DATE=`date +%Y%m%d%H%M%S`
sub1=192; sub2=168; sub3=15; sub4=100
USER=wasuser
PASSWD=wasuser
WARNAME="test.war"

APPDIR="/opt/was/app"
SERVER_BASE="/opt/was/servers/tomcat8_21"
SSHOPTION="-oStrictHostKeyChecking=no"

SOURCE=$sub1.$sub2.$sub3.$sub4;
TARGET=$SOURCE
echo "#############################################################";
echo "# INFO result [0] = SUCCESS or result [NOT 0] = FAIL ";
echo "# 0-0 $SOURCE SERVER APPLICATION GET THIS SERVER";
sshpass -p $PASSWD scp $USER@$SOURCE:/tmp/$WARNAME /tmp/$WARNAME ;
echo "# 0-0 Result: $?";
echo ""
echo "#############################################################";
echo "# CHECK WITH PING TO TARGET SERVER ";
echo "#############################################################";

while true
do
  cnt=1;
  sub4=`expr $sub4 + 100`;
  TARGET=$sub1.$sub2.$sub3.$sub4;
    ping -c 1 -w 1  $TARGET >/dev/null 2>&1;
    if [ $? -ne 0 ]; then
    echo "#############################################################";
    echo "# NO LONGER TARGET: $TARGET ";
    echo "#############################################################";
        sleep 1;
      break;
    else
    echo "# TARGET [$cnt]: $TARGET ";
    echo "";
   
    echo "# TASKS Start ";
   
    echo "# 1-1 TARGET $TARGET [$cnt] APPLICATION BACKUP[move] ";
    sshpass -p $PASSWD  ssh $SSHOPTION $USER@$TARGET mv $APPDIR/test.war $APPDIR/test.war.$DATE;
    echo "# 1-2 Result: $?";
    echo ""
   
    echo "# 2-1 THIS SERVER to $TARGET [$cnt] SERVER APPLICATION COPY ";
    sshpass -p $PASSWD  scp /tmp/$WARNAME $USER@$TARGET:$APPDIR/$WARNAME;
    echo "# 2-2 Result: $?";
    echo ""
   
    echo "# 3-1 $TARGET [$cnt] SERVER Shutdown ";
    sshpass -p $PASSWD  ssh -t $SSHOPTION $USER@$TARGET "cd $SERVER_BASE/bin; sudo -u $USER ./kill.sh";
    echo "# Result: $?";
    echo ""
   
    echo "# 4-1 $TARGET [$cnt] SERVER Startup ";
    sshpass -p $PASSWD  ssh -t $SSHOPTION $USER@$TARGET "cd $SERVER_BASE/bin; sudo -u $USER ./start.sh notail";
    echo "# Result: $?";
    echo ""
    echo "# TASKS END";
        sleep 1;
      cnt=$((cnt + 1));
    fi
  echo "-------------------------------------------------------------";
    sleep 1;
   
done

2019년 6월 24일 월요일

shell script ip address 순차 증가 후 리모트서버 실행 스크립트

내가 원하는 것은 2가지 였다

1. ip address 를 입력해서 순차적으로 ip address 시퀀스를 하나씩 증가
2. ip address가 연결이 가능할 경우 스크립트를 실행 하도록 명령어 실행

 #!/bin/sh

suba=192
subb=168
subc=23
subd=100

ipaddr=$suba\.$subb\.$subc\.$subd     # ip addr 이 잘 찍히는지 확인

echo "##########################" # 스크립트 시작 알림

while true  # ip addr 가 얼만큼 있을지 모르니 계속 증가
do

  subd=`expr $subd + 1`;    # 변수 초기화에서 늘어 나는 ip submask로 증가
  ipaddr=$suba\.$subb\.$subc\.$subd
  echo "subd = $subd";
  echo "ipaddr = $ipaddr";
  sleep 1;
  PING="`ping -c 1 -w 1 $ipaddr`";   # 핑 테스트 결과가 0 or 1 (0이 성공)

  if [ $? -eq 0 ]; then              # 핑 테스크가 성공 했을 경우
    ipaddr=$suba\.$subb\.$subc\.$subd
    echo "Prepared $ipaddr";
    CMD=`sshpass -proot scp ./ip_get.sh root@$ipaddr:/tmp/`;  # 원격서버에 파일 복사 (put)임
    $CMD
    sleep 1;
    echo "deployed $ipaddr";
  else
    echo "stopped  $ipaddr";   
    break        # 핑 테스크가 실패 했을 경우 빠저나옴
  fi

done

 echo로 디버깅을 해서 프로그램에 문제점을 찾았다


--------------------------------------------------------------------------------------------------
지난 버전
--------------------------------------------------------------------------------------------------
#!/bin/sh

suba=192 # subnet a
subb=168 # subnet b
subc=23  # subnet c
subd=100 # subnet d

ipaddr=$suba\.$subb\.$subc\.$subd   # ip address를 하나로 묶는다.

#echo $ipaddr
echo "##########################"

#CMD=`sshpass -proot scp ./ip_get.sh root@$ipaddr:/tmp/`

while true         # ip adress 를 계속 증가 시키기 위한 반복문
do
  echo "$ipaddr OK"
  NETTEST=`ping -c 1 -w 1 $ipaddr`  # ping을 통해서 서버가 살아 있는지 죽었는지 확인 한다.
  if [ $? -ne 0 ]; then             # ping에 대한 결과 값을 0, 1로 확인이 가능하고 0일 경우(정상) 반복 실행
    echo "NO $ipaddr "
    break
  fi
    subd=`expr $subd + 1`;         # 1씩 증가
    sleep 1;
    ipaddr=$suba\.$subb\.$subc\.$subd  # ip address 증가
    CMD=`sshpass -proot scp ./ip_get.sh root@$ipaddr:/tmp/` #scp를 통해서 리모트서버에 파일 복사
    $CMD

done

이게 정답이 아닌거 같은 느낌이 들지만

그래도 일단 써보고 개선 해야 겠다.

2019년 6월 21일 금요일

openjdk에서 JAVA_HOME 설정 스크립트

구글을 하면 openjdk 사용 시 JAVA_HOME 설정 하는 정보가 많다. (sunjava 해당 안됨)

스크립트가 아닌 수작업으로 해도 된다.

예를 들면 which javac 해서 readlink -f 해서 Ctrl + c  Ctrl -v 해서 지정해도 되지만,

좀더 편리하게 해보는게 어떤 방법이 있을까 고민을 했다.

그래서 일단 생각해봤다
get_javahome.sh 파일 내용

#!/bin/sh

JAVAC=`which javac`              # PATH에 있는 javac를 찾음
echo "JAVAC PATH = $JAVAC"

READLINK=`readlink -f $JAVAC`  # javac 실제 경로를 가져오고
echo "READLINK PATH = $READLINK"

# 여기서 문제다
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64/bin/javac

javac 디렉토리를 찾긴 했는데  실제 java_home은
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64 
여기까지다

dirname, awk, cut, sed 등등 명령어들이 생각 났지만 조합하기가 너무 어려웠다.

몇번의 테스트를 통해서 잘 안된 후 생각보다 심플 한 방법을 찾았다


DIR_NAME1=`dirname $READLINK`
echo "DIR_NAME1 PATH = $DIR_NAME1"

DIR_NAME2=`dirname $DIR_NAME1`
echo "DIR_NAME2 PATH = $DIR_NAME2"

JAVA_HOME=$DIR_NAME2
echo "JAVA_HOME PATH = $JAVA_HOME"


dirname으로 내가 원하는 디렉토리 정보를 추출 한 후 JAVA_HOME을 export

심플하고 쉽다.