메뉴 닫기

bash script 를 이용한 서버 관리

“bash script를 이용한 서버 관리 “

– 메모리 과부하 시 프로세스 재시작 –


서버 관리 Tip 중 간혹 서버를 관리하다보면 아무리 모니터링체크를 하여도 새벽에 장애가 발생하면 장애처리 시간이 최소 10분정도 발생하게 됩니다.

물론 장애가 발생하기 전에 서버 구축을 프로세스들을 최적화를 해야합니다.

프로세스 최적화를 하여도 서버 사양이 낮거나, 갑작스레 사용량이 증가함에 따라 문제가 생길 수 있습니다.

그런 경우에는 crontab을 이용하여 장애 예방을 해야합니다.

특정 스크립트를 작성하여 서버를 체크하고 장애예방을 해야합니다.

이 포스팅에서는 일반적인 Apache 운영 서버에서 메모리를 과도하게 사용할때 서버가 행이 걸려 멈추기전에 예방하는 방법을 설명합니다.

[개 요]

✅종    류 : 엔지니어링 
✅난이도 : ⭐ ⭐ 
✅내용요약 : bash 스크립트과 crontab을 이용한 서버 관리
✅테스트 환경 : CentOS 7 (Redhat 계열) 1대 + Ubuntu 22.04 (Debian) Web서버 1대
✅관련직무 : 시스템&클라우드 엔지니어

“시작하며”

 

    👉bash shell에 관련 설명 바로가기


 이 포스트는 bash script 과 crontab를 이용한 Apache 서버 관리 방법 과 활용사례에 대해 아래 순서로 설명합니다.

    1. bash script 작성

    2. crontab 설정

    3. 로그 확인

 

1) bash script 작성


Redhat에서 bash script를 작성합니다.

현재 상황은 Source로 설치된 Apache 데몬서비스로 인해 서버가 멈춰 장애가 발생하는 상황입니다.

이를 방지하는 bash 형 스크립트를 작성합니다.

 

Redhat bash 에서는 심볼릭 링크로  sh 와 bash가 동일합니다. 아래 결과값을 확인하시길 바랍니다. 
[root@localhost]# which bash
/usr/bin/bash
[root@localhost]# which sh
/usr/bin/sh
[root@localhost]# ls -al /usr/bin/bash
-rwxr-xr-x 1 root root 964536 4월 1 2020 /usr/bin/bash*
[root@localhost]# ls -al /usr/bin/sh
lrwxrwxrwx 1 root root 4 3월 8 2023 /usr/bin/sh -> bash*

 

다만 Debian 에서는 sh와 bash가 따로 설정하기전에는 다릅니다.

그렇기 떄문에 해당 명령어대로 했을때 아래와 같이 나옵니다.

lrwxrwxrwx 1 root root 4 3월 8 2023 /usr/bin/sh -> dash*

 

Debian 서버에서 만약 sh 를 dash로 사용해야하는 스크립트가 기존서버에 있다면 변경하지마세요. 만약 없다면 변경하시는걸 권유드립니다.

[root@localhost]# cd /usr/bin
[root@localhost]# unlink sh
[root@localhost]# ln -s bash sh
[root@localhost]# ls -al /usr/bin/sh
lrwxrwxrwx 1 root root 4 3월 8 2023 /usr/bin/sh -> bash*

 

bash 스크립트를 만들어줍니다.

[root@localhost]# mkdir /root/bin/
[root@localhost]# vi /root/bin/memory_apache_restart.sh

 

전체 메모리에서 남는 free 메모리양이 12% 미만일때 Apache 프로세스를 재시작하는 bash 스크립트입니다.

#!/bin/bash

# Set the threshold for free memory percentage (12% in this example)
THRESHOLD=12

# Get total and free memory values from the 'free' command output
TOTAL_MEMORY=$(free -m | awk '/Mem/{print $2}')
FREE_MEMORY=$(free -m | awk '/Mem/{print $4}')
TOTAL_MEMORY_GiB=$(free -g | awk '/Mem/{print $2}')
FREE_MEMORY_GiB=$(free -g | awk '/Mem/{print $4}')
CURRENT_TIME=$(date +"%H:%M:%S")

# Calculate the free memory percentage
FREE_PERCENTAGE=$(awk "BEGIN {printf \"%.2f\", $FREE_MEMORY/$TOTAL_MEMORY*100}")

# Calculate the total memory usage by Apache MiB
#APACHE_MEMORY=$(ps aux | grep '/usr/local/apache/bin/httpd' | awk '{sum += $6} END {printf "%.2f", sum/1024}')

# Calculate the total memory usage by Apache GiB
APACHE_MEMORY=$(ps aux | grep '/usr/local/apache/bin/httpd' | awk '{sum += $6} END {printf "Total Memory Usage: %.2f GiB\n", sum/(1024*1024)}')

# Compare with the threshold
if (( $(echo "$FREE_PERCENTAGE < $THRESHOLD" | bc -l) )); then

echo "===========" >> /var/log/apache_restart_log
echo "Current time: $CURRENT_TIME" >> /var/log/apache_restart_log
echo "Total memory is $TOTAL_MEMORY_GiB GiB" >> /var/log/apache_restart_log
echo "Free memory: $FREE_MEMORY_GiB GiB" >> /var/log/apache_restart_log
echo "Free percentage is $FREE_PERCENTAGE %" >> /var/log/apache_restart_log
echo "Apache memory usage: $APACHE_MEMORY MB" >> /var/log/apache_restart_log
echo "Free memory is below $THRESHOLD% of total." >> /var/log/apache_restart_log
echo "Apache was restarted due to insufficient memory." >> /var/log/apache_restart_log
echo "===========" >> /var/log/apache_restart_log
echo " " >> /var/log/apache_restart_log
echo " " >> /var/log/apache_restart_log

 # Execute the killall -9 httpd
 killall -9 httpd
 sleep 2;
 killall -9 httpd
 sleep 2;
 /etc/init.d/apachectl restart
 sleep 1;
 /etc/init.d/apachectl start
 sleep 1;
 /etc/init.d/apachectl start
 sleep 1;

else
 echo "Free memory is above $THRESHOLD% of total." 
 echo "Total memory is $TOTAL_MEMORY_GiB GiB"
 echo "Free memory is $FREE_MEMORY_GiB GiB"
 echo "Free percentage is $FREE_PERCENTAGE %"
 echo "Apache memory usage is $APACHE_MEMORY"
fi

해당 스크립트는 전체 메모리도 체크하고 전체메모리에서 free 메모리가 12% 미만일때 웹서버인 apache 데몬을 killall -9 로 강제종료 후 4초뒤에 실행하는 명령어 입니다.

그리고 이런상황이 발생할때 로그가 남도록 설정하는 스크립트입니다.

 

해당 스크립트를 테스트로 실행합니다.

[root@localhost]# /root/bin/memory_apache_restart.sh

 

 

 

2) crontab 설정


자동적으로 메모리를 체크하기 위해 crontab 설정을 합니다.

[root@localhost]# vi /etc/crontab

5분마다 메모리를 체크하여 장애예방을 합니다.

###memory check apache restart
*/5 * * * * root /bin/sh /root/bin/memory_apache_restart.sh

 

crontab을 재시작합니다.

[root@localhost]# service crond restart

 

3) 로그 확인


환경변수 설정을 위해 아래 작업을 수행합니다. 일단 디렉토리 구조체부터 생성합니다.

[root@localhost]# touch /var/log/apache_restart_log
[root@localhost]# cat /var/log/apache_restart_log
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x