Home 리눅스에서 자주 사용하는 스크립트
Post
Cancel

리눅스에서 자주 사용하는 스크립트

임의의 새로운 리눅스VM을 만들었다고 가정할 때, 해당 VM의 목적과는 상관없이 거의 대부분의 케이스에서 필요한 설정이 있다. 대표적으로는 로그가 무한하게 쌓이지 않도록 정기적으로 삭제 또는 백업하거나, VM이 재실행 됐을때 어플리케이션이 자동으로 시작하게 하는 것 등이 있다.
prometheus처럼 어플리케이션 레벨에서 데이터 보관기간을 설정할 수 있는 것은 해당 설정을 사용하면 좋지만, 그런 옵션을 지원하지 않는 경우가 있기 때문에 대부분의 환경에서 보편적으로 사용할 수 있는 명령어를 통해 해당 기능을 구현하는 것을 목표로 이 글을 작성한다.

로그 모니터링

톰캣을 실행시켜서 /home/qwerty/mw/logs경로에 매일 날자로 디렉토리를 만들고 해당 날자디렉토리 안에 로그파일이 생성된다고 가정하자.

1
2
3
4
5
6
7
8
9
└── logs
    ├── 2025-03-04
    │   ├── mobile.0.log
    │   ├── operator.0.log
    │   └── system.0.log
    └── 2025-03-05
        ├── mobile.0.log
        ├── operator.0.log
        └── system.0.log

톰캣을 실행시킨 후에 오늘 날자 경로로 들어가서 톰캣 로그를 봐야할 일이 종종 있는데, 해당 디렉토리를 찾아가는 것은 너무 번거롭다.
그래서 startup.sh파일과 동일한 경로에 log.sh파일을 만들어 다음 내용을 기입한다.

1
2
3
#!/bin/bash

tail -f /home/qwerty/mw/logs/$(date +%F)/*.log

startup.sh을 실행시킨 후에 바로 log.sh를 실행시키면 바로 로그를 모니터링 할 수 있다.

로그 삭제

logrotate를 이용하여 오래된 로그를 자동으로 삭제한다.
먼저, logrotate -v로 명령어가 설치되어 있는지 확인한 후에 아래 스크립트를 작성한다.

1
sudo vi /etc/logrotate.d/tomcat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 로그파일을 가공(압축)없이 180일간 보존하고, 180일이 지난 로그파일과 디렉토리를 영구적으로 삭제한다.
/home/qwerty/mw/logs/*/*.log {
    daily                  # 매일
    missingok              # 로그파일이 없어도 에러를 발생시키지 않음
    rotate 180             # 180일 보존
    notifempty             # 로그파일이 비어있으면 로테이션을 돌리지 않음
    noolddir               # 로테이션된 로그파일을 다른 디렉토리로 옮기지 않음
    create                 # 로테이션 후 새로운 빈 로그파일을 생성. //날짜별로 디렉토리가 생성된다면 불필요한 설정
    dateext                # 로테이션 된 로그파일의 이름에 날짜 확장자를 붙인다. // create와 함께 사용하는 것이 좋다. 
    dateformat -%Y-%m-%d   # dateext의 날짜형식 지정 // dateext와 함께 사용
    nocompress             # 압축하지 않음
    su qwerty qwerty       # qwerty유저 qwerty그룹으로 실행
    postrotate
        find /home/qwerty/mw/logs -maxdepth 1 -type d -mtime +180 -exec rm -rf {} \;
    endscript
}

위의 로그 트리와 같이 날자 디렉토리가 생기는 경우에는 디렉토리를 고려하여 /*/*.log로 작성해야 하고
날자 디렉토리가 생기지 않는 경우에는 *.log로 작성한다.
logrotate는 root권한으로 실행된다. 어플리케이션은 qwerty유저로 실행시켰기 때문에 root가 더 높아서 그냥 다 삭제할 줄 알았지만 로그파일 권한이 775라서 너무 넓게 허용되어있다면 삭제 거절할 수도 있다.
권한으로 인해 삭제오류가 발생하면 su user group을 추가한다.
logrotate의 maxage는 파일만 삭제하기 때문에 postrotate로 파일이 삭제된 빈 디렉토리를 삭제하게 설정한다.

어플리케이션 자동 시작(systemd)

yum install httpd 이런 식의 명령어로 설치할 경우에 systemd에 자동으로 등록된다.
그런 경우에는 systemctl enable httpd로 간단하게 자동시작을 등록할 수 있다.
systemctl is-enabled httpd를 하면 자동시작 등록 여부를 알 수 있다.

만약에 설치파일을 직접 VM에 업로드 하여 수동설치를 했을 경우에 systemd에 등록되지 않는다.
나의 경우에는 prometheus를 수동 설치했으니 다음과 같이 작성한다.

1
vi /etc/systemd/system/prometheus.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[Unit]
Description=Prometheus Monitoring Service
Wants=network-online.target
After=network-online.target

[Service]
User=qwerty
Group=qwerty
Type=simple
ExecStart=/home/qwerty/monitor/prometheus/prometheus \
    --config.file=/home/qwerty/monitor/prometheus/prometheus.yml \
    --storage.tsdb.path=/home/qwerty/monitor/prometheus/data
    --storage.tsdb.retention.time=180d
Restart=always

[Install]
WantedBy=multi-user.target

prometheus의 경우에는 start.sh같은 스크립트를 제공하지 않기 때문에 기본 실행 명령어에 옵션을 줄줄이 달아서 실행시켜야 한다.
톰캣처럼 start.sh, shutdown.sh를 제공하는 경우라면 sh파일의 경로를 적으면 된다.
root로 실행시키는 것이 아니라면 User/Group도 달아주면 좋다

1
2
3
4
systemctl daemon-reload
systemctl start prometheus
systemctl status prometheus
systemctl enable prometheus

위와 같이 등록후에 명령어로 사용하면 된다.

어플리케이션 자동 시작(crontab)

WEB 서버에 위치하는 것들은 대부분 내용이 잘 변하지 않는 것들이다. VM이 켜져있는 한 끌 일도 거의 없다.
그러나 WAS에 위치하는 것은 WEB에 있는 것들보다 좀 더 자주 변경되는 것들이 있다.
예를 들면 Springboot로 배포파일을 만들면 application.jar파일이 생성되는데 이 파일 안에 톰캣 인스턴스 구동에 필요한 모든 것이 들어있기 때문에 인스턴스 내용을 변경하려면 application.jar파일 자체를 교체해야 한다. 그렇게 하려면 일단 어플리케이션을 종료시킨 다음에 파일을 교체하는 과정이 필요하다.
또한 상황에 따라서 로그레벨을 변경하거나 메모리 설정을 변경할 경우에 이런 설정을 systemd에 넣어두면 root로 바꾼다음에 변경을 해야 하니 번거로움이 따르고, application.jar의 위치와 systemd의 위치가 다르기 때문에 왔다갔다 하는 번거로움이 따르기도 한다.
따라서 인스턴스 구동에 필요한 모든 것들을 모아서 start.sh파일을 작성한 다음에 crontab으로 VM재부팅 되었을 때 start.sh를 실행시키는 것이 유지관리면에서 좀 더 수월하다.

1
crontab -e

qwerty 유저로 접속한 상태에서 크론탭을 연다.

1
@reboot sleep 30 && /bin/bash /home/qwerty/mw/start.sh

VM이 켜진 후에 네트워크 연결이나 필수적인 프로세스가 먼저 동작하는 것을 기다리기 위해 30초를 기다린 후에 실행시킨다.

This post is licensed under CC BY 4.0 by the author.

React Springboot로 운영서버 구축과 Ssl인증서 적용

Springboot에서 유용한 스크립트