[Linux 셸 스크립트] 서버 관리 - 111 특정 프로세스가 정지했는지 감시하기
본문 바로가기
IT 이야기/Linux 셸 스크립트

[Linux 셸 스크립트] 서버 관리 - 111 특정 프로세스가 정지했는지 감시하기

by 찬찬이 아빠 2021. 4. 29.
반응형
  1. 사용 명령어

(1) ps

(2) grep

(3) wc

 

 

  2. 키워드 & 사용처

(1) 키워드

프로세스, 감시, 정지

 

(2) 사용처

서비스 제공 시 존재해야 할 프로세스가 정지하지 않았는지 감시하고 싶을 때 사용합니다.

 

  3. 실행 예제
$ ./process-isalive.sh
[ERROR] 프로세스 /usr/llibexec/mysqlid 찾지 못했습니다.
start alert.sh ...

 

 

  4. 스크립트

#!/bin/sh

 

# 감시할 프로세스 명령어

commname="/usr/libexec/mysqld"             

 

# 대상 명령어 프로세스 수를 카운트

count=$(ps ax -o command | grep "$commname" | grep -v "^grep" | wc -l) 

 

# grep 명령어 출력 결과가 0이면 프로세스가 존재하지 않으므로 알림 처리하기

if [ "$count" -eq ]; then             

    echo "[ERROR] 프로세스 $commname 찾지 못했습니다." >&2   

    /home/park/bin/alert.sh       

fi

 

 

  5. 해설

이 스크립트는 지정한 프로세스가 존재하는지 감시합니다. 여기서 MySQL 서버 프로세스 /usr/libexec/mysqld가 실행되었는지 감시해서 없으면 프로세스가 다운됐다고 보고 alert.sh를 실행합니다. 그리고 예제에서는 alert.sh가 통지 메일을 송신하는 등 경고 처리를 하는 스크립트라고 가정합니다.

 

서버 운용 시 프로세스가 어느새 정지하는 문제는 자주 벌어집니다. 서버 자체의 생존 여부는 ping 명령어로 하더라도 프로세스가 죽으면 정상적으로 서비스할 수 없습니다. 따라서 프로세스 감시 구조는 서비스를 제공하기 위한 중요한 요소입니다. 여기서는 셸 스크립트를 써서 프로세스가 존재하는지 확인하는 예를 살펴봅니다.

 

예제는 에서 감시할 프로세스를 지정합니다. 명령어 이름으로 프로세스를 확인하므로 리눅스(CentOS)에서 MySQL을 rpm으로 설치할 때 실행 명령어 /usr/libexec/mysqld를 지정합니다.

 

에서 우선 ps 명령어 -ax 옵션으로 모든 프로세스를 표시하고 -o 옵션으로 표시 항목을 지정합니다 ."-o command"라고 지정하므로 명령어 이름 항목만 표시합니다.

$ ps ax -o command
COMMAND
/sbin/init
[kthreadd]
[migration/0]
... 생략 ...
sshd: park [priv]
sshd: park@pts/0

이것은 프로세스 감시에 필요 없는 문자열이나 숫자가 들어 있으면 잘못 인식할 수 있기 때문입니다. 그리고 -o 옵션은 BSD 옵션에는 없으므로 리눅스에서 사용할 때도 하이픈을 함께 지정합니다.

 

의 ps 명령어 출력은 파이프에 넘겨서 grep 명령어를 실행해서 셸 변수 commname으로 지정한 명령어 이름과 일치하는지 확인합니다. 그리고 한 번 더 파이프로 이어서 grep -v "^grep"을 합니다.

 

grep 명령어 -v 옵션은 그 패턴을 포함한 줄을 제거하는 옵션입니다. 왜 이 명령어를 사용할까요? 단순히 mysqld 프로세스를 감시한다고 grep "/usr/libexec/mysqld"라고하면 이 grep 명령어 자체가 ps 명령어 목록에 들어 있어서 잘못 인식되기 때문입니다.

$ ps ax -o command | grep "/usr/libexec/mysqld"
grep /usr/libexec/mysqld

따라서 grep 명령어 자체를 제거하기 위해 grep -v "^grep"을 지정합니다. 는 마지막에 wc 명령어 줄 수를 세는 -l 옵션을 써서 일치한 줄 수를 카운트하고 명령어 치환 $( )로 셸 변수 count에 대입합니다. 이것이 감시 대상 프로세스 수가 됩니다.

 

은 감시 통지를 할 것인지 판별합니다. 셸 변수 count에는 grep 명령어에 일치한 줄 즉, 프로세스 수가 들어 있습니다. 같은지 어떤지 판별하는 -eq 연산자로 비교해서 이것이 0이라면 프로세스가 존재하지 않는다는 의미입니다. 따라서 프로세스를 찾지 못하면 메시지를 echo 명령어로 표시하고 이어서 감시 통지를 하는 alert.sh를 실행합니다.

 

이렇게 프로세스 감시가 가능합니다. 이 셸 스크립트를 cron에 등록하고 정기적으로 실행하는 것이 일반적인 사용법입니다.

 

 

  6. ps 명령어 설명

 

 

 

 

 

 

 

참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전

반응형

댓글