자동화 배치 셸 편

20339 단어 Linux
머리말
최근 에 자동화 배치 스 크 립 트 를 쓰 고 있 습 니 다. 제품 이 10 여 개의 모듈 과 관련 되 기 때문에 모든 모듈 은 배치 해 야 합 니 다. 수 동 배치 가 너무 번 거 롭 고 문제 가 발생 하기 쉬 우 며 필요 한 것 은 스 크 립 트 를 통 해 자동화 배 치 를 실현 해 야 합 니 다. 주요 수요: bat 각본 자동 화 를 통 해 svn, ftp 라 이브 러 리 에서 각 모듈 패키지, 데이터, 권한 수여 파일 등 을 꺼 내야 합 니 다.완전한 설치 배치 패 키 지 를 생 성하 여 인공 가방 이 가 져 오 는 차이성 으로 인 한 각종 문 제 를 줄인다.또한 셸 스 크 립 트 를 통 해 Liux 서버 에 각 모듈 을 자동화 배치 해 야 합 니 다. tomcat, war 패키지 배치, 현장 설정 수정, 데이터 베이스 백업, 업데이트 등 을 포함 하여 배치 의 복잡 도 를 낮 추고 인위적인 오류 수정 설정 등 으로 인 한 문 제 를 줄 여야 합 니 다.
자신 은 이전에 bat 스 크 립 트 와 셸 스 크 립 트 를 거의 써 본 적 이 없 기 때문에 Liux 도 시스템 의 일반적인 조작 명령 만 할 수 있 기 때문에 급 하 게 배 우 며 사용 할 수 밖 에 없 었 습 니 다. 돌 을 만 져 강 을 건 널 수 밖 에 없 었 습 니 다. 다행히 노력 을 한 후에 부탁 을 저 버 리 지 않 고 기능 수 요 를 대체적으로 실현 하 였 습 니 다.현재 최근 몇 년 동안 자신 이 배우 면서 사용 한 bat 스 크 립 트 와 셸 스 크 립 트 두 부분 에 사용 되 는 주요 기능 과 실현 방안 을 정리 하여 기록 을 정리 하여 나중에 찾 아 볼 수 있 도록 합 니 다. 필요 한 학생 들 도 참고 할 수 있 습 니 다.
셸 편
셸 스 크 립 트 압축 해제 성공 여부 판단
  unzip -o $src -d $des >/dev/null
  if [ $? -eq 0 ]; then
    printAndWrite "info: unzip $src successfully!!"
  else
    printAndWrite "error : unzip $src failed , the storage limited ?"
    #exit
  fi

unzip - o $src - d e s 압축 을 풀 때 같은 파일 을 직접 덮어 씁 니 다. >/d e v/n u l 은 화면 출력 내용 을 재 설정 으로 차단 합 니 다. des 압축 을 풀 때 같은 파일 을 직접 덮어 씁 니 다. >/dev/null 은 화면 출력 내용 을 재 설정 으로 차단 합 니 다. des 압축 을 풀 때 같은 파일 을 직접 덮어 씁 니 다.>/dev/null 은 화면 출력 내용 을 재 설정 하여 차단 합 니 다.?이전 명령 이 실 행 된 종료 상 태 를 가 져 오 는 것 입 니 다. 0 은 오류 가 없 음 을 표시 하고 다른 값 은 오류 가 있 음 을 표시 합 니 다.
정의 함수: 화면 출력 과 파일 출력 을 동시에 실현 합 니 다.
time=$(date "+%Y%m%d%H%M%S")
#print $info in screen and write in file
function printAndWrite(){
  info=$1
  echo $info
  echo $info >> deploy_log_package_$time.txt
}

주로 배치 과정 에서 의 배치 상황 을 기록 하 는 데 사 용 됩 니 다. >> 는 리 셋 기호 입 니 다. 출력 정 보 를 지정 한 파일 로 추가 로 출력 합 니 다. 이 파일 이 존재 하지 않 으 면 자동 으로 생 성 됩 니 다. > 또한 리 셋 기호 입 니 다. 원본 파일 의 기 존 내용 을 덮어 쓰 는 방식 으로 지정 한 파일 로 출력 하 는 것 과 차이 가 있 습 니 다.
셸 스 크 립 트 ftp 가 져 오기, ftp 에서 자원 자동 으로 가 져 오기
 wget -r -nH -nd -q ftp://ftpip:21/xxx/ xxx/xxx/--ftp-user=ftpusername --ftp-password=ftppassword

셸 스 크 립 트 는 대상 폴 더 의 모든 파일 과 폴 더 를 삭제 합 니 다. (신중하게 사용 하고 백업 후 작업 을 권장 합 니 다)
rm -rf $TARGET_DIR/*

셸 스 크 립 트 이동 디 렉 터 리 파일
mv $TARGET_DIR/$module_name $bak_dir

확장: 대상 디 렉 터 리 는 원래 디 렉 터 리 와 일치 합 니 다. 새 파일 이름 을 지 정 했 습 니 다. 효 과 는 이름 만 바 꾸 는 것 입 니 다.
mv  /xxx/x.txt   /xxx/y.txt    

대상 디 렉 터 리 는 원본 디 렉 터 리 와 일치 하지 않 습 니 다. 새 파일 이름 을 지정 하지 않 았 습 니 다. 효 과 는 이동 만 하 는 것 입 니 다.
mv  /xxx/x.txt   /xxx/yyy/

대상 디 렉 터 리 는 원본 디 렉 터 리 와 일치 합 니 다. 새 파일 이름 을 지 정 했 습 니 다. 효 과 는 이동 + 이름 바 꾸 기 입 니 다.
mv  /xxx/x.txt   /xxx/yyy/y.txt

셸 스 크 립 트 디 렉 터 리 파일 복사
cp xxx/test.war $TARGET_DIR/xxx/

셸 스 크 립 트 는 폴 더 가 존재 하 는 지 여 부 를 판단 하고 소프트 링크 를 만 듭 니 다.
  if [ ! -d $TARGET_DIR/tomcat-9.0.16 ];
  then
      ln -s $TARGET_DIR/tomcat-9.0.16 $TARGET_DIR/tomcat
	  printAndWrite "create link $TARGET_DIR/xxxln successfully"
  fi

소프트 링크 의 장점: 다른 작업 은 소프트 링크 를 바탕 으로 실 행 될 수 있 습 니 다. 다음 에 원본 파일 이 버 전 업그레이드 등 으로 인해 변경 해 야 할 경우 소프트 링크 만 수정 하면 됩 니 다. 다른 소프트 링크 를 기반 으로 하 는 것 은 움 직 이지 않 아 도 됩 니 다.
셸 스 크 립 트 단계 생 성 디 렉 터 리
mkdir -p xxx/xxx

셸 스 크 립 트 는 파일 이 존재 하 는 지 여 부 를 판단 합 니 다.
  if [ -a xxx/xxx.war ];
  then
    printAndWrite "xxx war is exist"
  fi

셸 스 크 립 트 는 폴 더 가 비어 있 는 지 여 부 를 판단 합 니 다.
    data_files=`ls $DIR/xxx`
	if [ ! -z "$data_files" ];
	then
	    printAndWrite "xxx data is exist"
	fi

셸 스 크 립 트 순환
for i in $DIR/xxx/*.zip;
do 
	unzip -o $i  -d $TARGET_DIR/xxx;
done

셸 스 크 립 트 압축 풀기 tar 패키지 지정 디 렉 터 리
tar zvxf $DIR/xxx/xxx.tar.gz -C $TARGET_DIR/xxx/

셸 스 크 립 트 가 파일 의 값 을 읽 습 니 다.
MYSQL_USER=`sed '/^MYSQL_USER=/!d;s/.*=//' $DIR/file.txt`

셸 스 크 립 트 ip 와 포트 교체
sed -ri "s/(http:\/\/)([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+)/\1$TESTIP:8899/g" $data_xml

mysql 설치 디 렉 터 리 찾기
MYSQL_DIR="$( ps -aux | grep mysqld | awk '{print$11}'| grep mysqld | sed 's/\/mysqld//' )"

셸 스 크 립 트 백업 데이터베이스, sql 문 구 를 실행 합 니 다.
    $MYSQL_DIR/mysqldump -u$MYSQL_USER -p$MYSQL_PWD -h 127.0.0.1 test_db > /xxx/bk.sql
    $MYSQL_DIR/mysql -u$MYSQL_USER -p$MYSQL_PWD -h 127.0.0.1 -e 'create database if not exists test_db_bkb'
    $MYSQL_DIR/mysql -u$MYSQL_USER -p$MYSQL_PWD -h 127.0.0.1 test_db_bkb < /xxx/bk.sql

셸 스 크 립 트 에서 파일 을 찾 고 검색 결 과 를 가 져 와 화면 에서 파일 로 출력 하고 출력 합 니 다.
    return_str=`grep -n "ERROR" log.txt`
	if [ ! -z "$return_str" ]
	then
		printAndWrite "$return_str"
	fi

주의 문 구 는 · 포함 되 어 있 습 니 다. 이 문 자 는 자주 사용 하 는 작은 따옴표 가 아 닙 니 다. Esc 키 아래 에 있 습 니 다.
셸 스 크 립 트 는 자동 으로 시작 합 니 다. 이 스 크 립 트 에 아래 문 구 를 추가 하면 이 스 크 립 트 는 자동 으로 시작 할 수 있 습 니 다.
      chmod +x $0
	  chmod +x /etc/rc.d/rc.local

	  filename=$(basename ${0})
	  inlocal=$(cat /etc/rc.d/rc.local | grep $filename)
	  if [ ! -n "$inlocal" ]; then
		echo "$cur_path/$filename > /tmp/$filename.log" >> /etc/rc.d/rc.local
		echo "success add $(basename ${0}) to rc.local"
	  else
		echo 'success inited'
	  fi
	  exit 0

셸 스 크 립 트 는 포트 에 따라 프로 세 스 가 시작 되 었 는 지 여 부 를 판단 합 니 다.
function port_is_started(){
  port=$1
  COUNT=0
  while [ $COUNT -lt 1 ]; do    
	echo -e ".\c"
	sleep 1 
	COUNT=`netstat -anp|grep $port | grep LISTEN | awk '{print $7}' | wc -l`
	if [ $COUNT -gt 0 ]; then
		break
	fi
  done
  
  echo "$port is started!"
}

셸 스 크 립 트 는 포트 에 따라 프로 세 스 를 죽 입 니 다.
function stop_by_port(){
	port=$1
	pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }');
	if [  -n  "$pid"  ];  then
		kill  -9  $pid;
		sleep 2
	fi
}

셸 스 크 립 트 는 큰 파일 을 정리 하거나 다른 작업 을 할 때 모든 사용자 에 게 적 용 됩 니 다.
crontab -e   

그리고 i 를 입력 하면 편집 모드 에 들 어가 명령 을 추가 할 수 있 습 니 다.
22 * * * * sh /xxx/clear.sh >> /xxx/clear.sh

자동화, 직접 수정/etc/crontab 파일, 루트 사용자 에 게 만 적용
22 * * * * sh /xxx/clear.sh >> /xxx/clear.sh

셸 스 크 립 트 로그 파일 은 자동 으로 분 리 됩 니 다. 시스템 이 장시간 실 행 된 후 일부 로그 파일 이 공간 을 너무 많이 채 워 시스템 이상 이 etc/logrotate. d 디 렉 터 리 에 설정 파일 을 설치 하지 않도록 합 니 다.
tomcat_catalina
/xxx/tomcat-9.0.16/logs/catalina.out {
daily
rotate 7
missingok
dateext
compress
notifempty
copytruncate
}

좋은 웹페이지 즐겨찾기