아이택시를 개발하면서 처음 배포를 할때 24시간 동안 멈추지 않고 동작을 하기 위해서 nohup을 사용하게 됐고 인터넷을 뒤져보며 nohup output을 로그로 저장하고 DB를 백업하는 스크립트를 작성하여 사용하고 있었다.
그러다가 출시 후 사용되는 서버에서도 다시 설정을 하다가 기록을 남기려 글을 쓰게 됐다.
나는 nohup의 표준출력과 에러를 따로 저장하고 싶었기 때문에 nohup을 사용할 때 표준출력은 nohup.out에, 표준에러는 error.log에 나오도록 설정을 해놓았다.
nohup java -jar itaxi-0.0.1-SNAPSHOT.jar 1 > nohup.out 2 > error.log &
이렇게 출력과 에러가 따로 나오게 설정을 한 후에는 스크립트 파일을 만들어서 crontab에서 추가하여 돌리기만 하면 끝이다. 스크립트 파일에서는 nohup.out과 error.log에 저장된 출력과 에러들을 각각 logs/response와 logs/error 폴더들에 저장한 날짜를 이름에 추가하여 저장한다.
#!/bin/bash
file=/home/ubuntu/nohup.out
errorFile=/home/ubuntu/error.log
date=`date +%y%m%d-%H%M%S`
filePath=/home/ubuntu/logs/response/nohup.$date.out
errorFilePath=/home/ubuntu/logs/error/error.$date.log
if [ -s $file ] ; then
cp "$file" "$filePath"
cp "$errorFile" "$errorFilePath"
echo "Backup Completed cp $file $filePath"
echo "Backup Completed cp $errorFile $errorFilePath"
cat /dev/null > "$file"
cat /dev/null > "$errorFile"
else
echo "No Backup Needed $file"
fi
echo "*******************************************"
현재 사용되는 서버에서는 MariaDB를 사용하고 있다.
MySQL과 거의 비슷하다고 볼수도 있지만 조금씩 명령어가 다르다던가 하는 차이점들이 있으니 찾아보면서 하는게 좋다.
DB 백업을 위한 스크립트에는 백업들이 저장될 폴더를 설정해주고, DB에 접속할 수 있는 로그인 정보와 저장할 스키마의 이름을 추가한다.
마지막 줄에는 현재 시간으로부터 저장된지 2주가 지난 백업 파일을 삭제하는 기능을 추가했다.
#!/bin/bash
DATE=$(date +%Y-%m-%d)
BACKUP_DIR=/home/ubuntu/backup
if [ ! -d $BACKUP_DIR ]; then
mkdir $BACKUP_DIR
fi
mysqldump -u"USER" -p"PASSWORD" "SCHEMA" > $BACKUP_DIR/"backup_"$DATE.sql
find $BACKUP_DIR -ctime +14 -exec rm -f {} \;
위에서 작성한 스크립트들을 정기적으로 실행하게 crontab을 설정해준다.
나는 로그 저장은 매일 23시 59분에, DB 백업은 매일 아침 6시에 실행하게 설정을 하고, 각 스크립트들이 잘 실행 됐는지를 확인하기 위한 로그도 따로 저장하도록 설정했다.
crontab -e #crontab 추가
59 23 * * * sudo sh /home/ubuntu/nohup.sh >> /home/ubuntu/logs/nohup.log 2>&1
0 6 * * * sudo sh /home/ubuntu/db_backup.sh >> /home/ubuntu/logs/cron_db_backup.log 2>&1
crontab -l #crontab 리스트 보기
잘 설정이 된걸 확인했다면 crontab을 재시작하자.
service cron restart