홈 › 리눅스 운영 › 08 / 13

셸 스크립트 (운영 자동화)

섹션 7진행 0 / 13

4. 응용 변형 예제

4.1 여러 서버 헬스 체크

07 레슨의 루프를 스크립트로 만든 형태입니다. 실패한 서버가 하나라도 있으면 종료 코드 1 입니다.

bash
#!/usr/bin/env bash
set -uo pipefail
fail=0
for h in "$@"; do
  code=$(curl -s -o /dev/null -m 3 -w '%{http_code}' "http://$h:8080/actuator/health" || echo 000)
  printf '%-10s %s\n' "$h" "$code"
  [ "$code" = 200 ] || fail=1
done
exit $fail

set -e 를 뺀 이유는 curl 실패가 정상 흐름이기 때문입니다. || echo 000 으로 실패를 값으로 바꿉니다.

4.2 백업 스크립트 뼈대

bash
#!/usr/bin/env bash
set -euo pipefail
SRC=${1:?원본 폴더}; DEST=${2:?백업 폴더}
STAMP=$(date +%Y%m%d_%H%M%S)
mkdir -p "$DEST"
tar czf "$DEST/backup-$STAMP.tgz" -C "$(dirname "$SRC")" "$(basename "$SRC")"
find "$DEST" -name 'backup-*.tgz' -mtime +30 -delete
echo "backup: $DEST/backup-$STAMP.tgz"

${1:?} 두 개로 인자 검사를 끝냅니다. 06 레슨의 find -delete 가 정리를 맡습니다.

4.3 설정 파일 읽기

key=value 파일을 . 으로 읽는 대신 필요한 키만 뽑으면 안전합니다.

bash
get_conf() { grep -E "^$1=" "$CONF" | cut -d= -f2- | tail -n 1; }
PORT=$(get_conf server.port)
DB_URL=$(get_conf spring.datasource.url)

. 으로 읽으면 파일 안의 명령이 실행됩니다. 신뢰할 수 없는 파일은 이렇게 값만 꺼냅니다.

4.4 사용자 확인 프롬프트

대화형으로만 쓰는 스크립트는 위험한 단계 전에 확인을 받습니다.

bash
read -r -p "운영 서버에 배포합니다. 계속? [y/N] " ans
[[ $ans == [yY] ]] || { echo "취소"; exit 0; }

cron 에서는 입력이 없어 멈추므로 [ -t 0 ] 으로 터미널인지 확인하고 아닐 때는 건너뜁니다.

4.5 병렬 실행과 wait

서버 여러 대에 같은 명령을 동시에 보낼 때 & 와 wait 를 씁니다.

bash
for h in app1 app2 app3; do
  ssh "$h" 'sudo systemctl restart myapp' > "log.$h" 2>&1 &
done
wait
grep -l -i error log.* || echo "모두 성공"

wait 는 모든 백그라운드가 끝날 때까지 기다립니다. 결과는 서버별 파일로 남겨 나중에 봅니다.