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 명령어 설명 |
참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전
'IT 이야기 > Linux 셸 스크립트' 카테고리의 다른 글
[Linux 셸 스크립트] 서버 관리 - 113 프로세스를 감시해서 다운 시 자동으로 재실행하기 (0) | 2021.04.29 |
---|---|
[Linux 셸 스크립트] 서버 관리 - 112 특정 프로세스 실행 개수가 제한값을 넘었는지 확인하기 (0) | 2021.04.29 |
[Linux 셸 스크립트] 서버 관리 - 110 서버 구축 패키지 목록을 셸 스크립트 형태로 관리하기 (0) | 2021.04.27 |
[Linux 셸 스크립트] 서버 관리 - 109 RPM 패키지명이 적힌 목록 파일에서 각각의 패키지가 설치, 갱신된 날짜 확인하기 (0) | 2021.04.23 |
[Linux 셸 스크립트] 서버 관리 - 108 파일명으로 설치된 RPM 패키지명을 확인하기 (0) | 2021.04.23 |
댓글