>웹 프론트엔드 >JS 튜토리얼 >쉘 스크립트로 Linux 시스템 및 프로세스 자원 모니터링 구현_기본 지식

쉘 스크립트로 Linux 시스템 및 프로세스 자원 모니터링 구현_기본 지식

WBOY
WBOY원래의
2016-05-16 16:10:572108검색

서버를 운영 및 유지 관리하는 과정에서 CPU 부하 모니터링, 디스크 사용량 모니터링, 프로세스 번호 모니터링 등 서버의 다양한 리소스를 모니터링하여 적절한 조치가 취해지면 즉시 알람 및 알림을 제공해야 하는 경우가 많습니다. 시스템 관리자에게 이상이 발생했습니다. 이 기사에서는 Linux 시스템에서 몇 가지 일반적인 모니터링 요구 사항과 셸 스크립트 작성을 소개합니다.

기사 디렉토리:

1.Linux는 Shell을 사용하여 프로세스가 존재하는지 확인합니다
2.Linux는 Shell을 사용하여 프로세스 CPU 사용률을 감지합니다
3.Linux는 Shell을 사용하여 프로세스 메모리 사용량을 감지합니다
4.Linux는 Shell을 사용하여 프로세스 핸들 사용을 감지합니다
5.Linux는 Shell을 사용하여 TCP 또는 UDP 포트가 수신 대기 중인지 확인합니다
6.Linux는 Shell을 사용하여 특정 프로세스 이름의 실행 중인 프로세스 수를 확인합니다
7.Linux는 Shell을 사용하여 시스템 CPU 로드를 감지합니다
8.Linux는 Shell을 사용하여 시스템 디스크 공간을 감지합니다.
9. 요약

프로세스가 존재하는지 확인

프로세스를 모니터링할 때 일반적으로 프로세스 ID를 가져와야 합니다. 프로세스 ID는 프로세스의 고유 식별자입니다. 그러나 때로는 서버에서 서로 다른 사용자로 실행되는 동일한 프로세스 이름을 가진 여러 프로세스가 있을 수 있습니다. 다음 함수 GetPID 지정된 사용자 하에서 지정된 프로세스 이름의 프로세스 ID를 가져오는 기능을 제공합니다(현재는 이 사용자 하에서 이 프로세스 이름으로 프로세스 시작을 고려함). 여기에는 사용자 이름과 프로세스 이름이라는 두 가지 매개변수가 있습니다. 먼저 ps를 사용하여 프로세스 정보를 찾고 동시에 grep을 사용하여 필요한 프로세스를 필터링하고 마지막으로 sed 및 awk를 사용하여 필요한 프로세스의 ID 값을 찾습니다(이 기능은 실제 상황에 따라 수정 가능) , 기타 정보를 필터링해야 하는 경우 등).

목록 1. 프로세스 모니터링

코드 복사 코드는 다음과 같습니다.

함수 GetPID #사용자 #이름
{
PsUser=$1
PsName=$2
pid=`ps -u $PsUser|grep $PsName|grep -v grep|grep -v vi|grep -v dbxn
|grep -v tail|grep -v start|grep -v stop |sed -n 1p |awk '{print $1}'`
에코 $pid
}

샘플 데모:

1) 소스 프로그램(예를 들어 사용자가 루트이고 프로세스 이름이 CFTestApp인 프로세스 ID를 찾습니다.)

코드 복사 코드는 다음과 같습니다.

PID=`GetPID 루트 CFTestApp`

에코 $PID

2) 결과 출력

코드 복사 코드는 다음과 같습니다.

11426
[dyu@xilinuxbldsrv 쉘]$

3) 결과 분석

위 출력에서 ​​볼 수 있듯이 11426은 루트 사용자 아래 CFTestApp 프로그램의 프로세스 ID입니다.

4) 명령어 소개

1. ps: 시스템에서 즉시 프로세스 정보를 봅니다. 매개변수: -u 사용자 이름을 사용하여 지정할 수도 있는 이 사용자에 속한 프로그램의 상태를 나열합니다. -p는 프로세스 식별자를 지정하고 프로세스 상태를 나열합니다. -o는 출력 형식을 지정합니다. 2. grep: 파일에서 문자열과 일치하는 현재 행을 찾는 데 사용됩니다. 매개변수: -v 역방향 선택. 즉, '검색 문자열' 내용 없이 행을 표시합니다. 3. sed: 파일이나 표준 입력에서 내보낸 파일을 편집하고 한 번에 한 줄의 콘텐츠만 처리할 수 있는 비대화형 텍스트 편집기입니다. 매개변수: -n 다음 입력 행을 읽고 첫 번째 명령 대신 다음 명령을 사용하여 새 행을 처리합니다. p 플래그는 일치하는 라인을 인쇄합니다. 4. awk: linux/unix에서 텍스트 및 데이터 처리에 사용되는 프로그래밍 언어입니다. 데이터는 표준 입력, 하나 이상의 파일 또는 기타 명령의 출력에서 ​​가져올 수 있습니다. 사용자 정의 함수, 동적 정규 표현식과 같은 고급 기능을 지원하며 Linux/Unix에서 강력한 프로그래밍 도구입니다. 명령줄에서 사용되지만 스크립트로 더 자주 사용됩니다. awk가 텍스트와 데이터를 처리하는 방식: 파일을 첫 번째 줄부터 마지막 ​​줄까지 한 줄씩 스캔하여 특정 패턴과 일치하는 줄을 찾고 해당 줄에서 원하는 작업을 수행합니다. 처리 작업이 지정되지 않은 경우 일치하는 행이 표준 출력(화면)에 표시됩니다. 모드가 지정되지 않은 경우 작업에 지정된 모든 행이 처리됩니다. 매개변수: -F fs 또는 –field-separator fs: 입력 파일 접기 구분 기호를 지정합니다. fs는 -F:와 같은 문자열 또는 정규식입니다.
때로는 프로세스가 시작되지 않을 수도 있습니다. 프로세스 ID가 존재하는지 확인하는 기능은 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.

프로세스가 존재하지 않습니다.
# 프로세스가 존재하는지 확인
If [ "-$PID" == "-" ]
그럼
{
echo "해당 프로세스가 존재하지 않습니다."
}
안녕

프로세스 CPU 사용률 감지

애플리케이션 서비스를 유지 관리하다 보면 CPU 사용량이 너무 많아 업무 정체 및 업무 중단을 초래하는 상황이 자주 발생합니다. 과도한 CPU는 비즈니스 과부하 또는 무한 루프와 같은 비정상적인 상황으로 인해 발생할 수 있습니다. 비즈니스 프로세스 CPU는 스크립트를 통해 지속적으로 모니터링됩니다. 적시에 업무 중단 등을 피하십시오. 다음 함수는 지정된 프로세스 ID에 대한 프로세스 CPU 사용률을 가져옵니다. 프로세스 ID에 대한 매개변수가 있습니다. 먼저 ps를 사용하여 프로세스 정보를 찾고, grep -v를 통해 %CPU 행을 필터링하고, 마지막으로 awk를 사용하여 CPU 사용률의 정수 부분을 찾습니다(여러 개가 있는 경우). 시스템의 CPU, CPU 사용률이 100%를 초과할 수 있습니다.

List 2. 업무프로세스 CPU 실시간 모니터링

코드 복사 코드는 다음과 같습니다.

GetCpu 함수
{
CpuValue=`ps -p $1 -o pcpu |grep -v CPU awk '{print $1}' awk - F. '{print $1}'`
에코 $CpuValue
}

다음 함수는 위 함수 GetCpu를 통해 이 프로세스의 CPU 사용률을 얻은 다음 조건문을 사용하여 CPU 사용률이 80%를 초과하는 경우(실제 상황에 따라 조정 가능) 여부를 확인하는 것입니다. 알람이 출력되고, 그렇지 않으면 정상적인 정보가 출력됩니다.

목록 3. CPU 사용률이 한도를 초과하는지 확인

코드 복사 코드는 다음과 같습니다.

CheckCpu 기능
{
PID=$1
cpu=`GetCpu $PID`
만약 [ $cpu -gt 80 ]
그럼
{
echo “CPU 사용량이 80%를 초과했습니다.”
}
그렇지 않으면
{
echo “CPU 사용량은 정상입니다”
}
파이
}

샘플 시연:

1) 소스 프로그램 (위에서 CFTestApp의 프로세스 ID를 11426으로 쿼리했다고 가정)

코드 복사 코드는 다음과 같습니다.

CPU 11426 확인

2) 결과 출력
코드 복사 코드는 다음과 같습니다.

CPU 사용량은 75
CPU 사용량은 정상입니다
[dyu@xilinuxbldsrv 쉘]$

3) 결과분석

위 출력에서 ​​볼 수 있듯이 CFTestApp 프로그램의 현재 CPU 사용량은 75%이며 이는 정상이며 80% 경보 제한을 초과하지 않습니다.

프로세스 메모리 사용량 감지

응용 프로그램 서비스를 유지 관리하다 보면 과도한 메모리 사용으로 인해 프로세스가 충돌하여 업무가 중단되는 상황이 자주 발생합니다(예: 32비트 프로그램의 주소 지정 가능한 최대 메모리 공간은 4G입니다. 이를 초과하면 메모리 응용 프로그램이 실패하고 실제 메모리도 제한됩니다. 과도한 메모리 사용량은 메모리 누수, 메시지 누적 등으로 인해 발생할 수 있습니다. 비즈니스 프로세스의 메모리 사용량을 스크립트를 통해 지속적으로 모니터링하여 메모리 사용량이 비정상적일 때 적시에(예: SMS를 통해) 알람을 보낼 수 있습니다. 유지보수 담당자가 적시에 이를 처리할 수 있습니다. 다음 함수는 지정된 프로세스 ID에 대한 프로세스 메모리 사용량을 가져옵니다. 프로세스 ID에 대한 매개변수가 있으며, 먼저 ps를 사용하여 프로세스 정보를 찾고, grep -v를 통해 VSZ 라인을 필터링한 다음, 1000으로 나누어 메모리 사용량을 메가바이트 단위로 가져옵니다.

목록 4. 비즈니스 프로세스의 메모리 사용량 모니터링

코드 복사 코드는 다음과 같습니다.

GetMem 함수
{
MEMUsage=`ps -o vsz -p $1|grep -v VSZ`
(( MEMUsage /= 1000))
에코 $MEMUsage
}

다음 함수는 위 함수 GetMem을 통해 이 프로세스의 메모리 사용량을 얻은 다음 조건문을 사용하여 메모리 사용량이 1.6G를 초과하는지 여부를 확인하는 것입니다(실제 상황에 따라 조정 가능). 알람이 출력되고, 그렇지 않으면 정상적인 정보가 출력됩니다.

목록 5. 메모리 사용량이 한도를 초과하는지 확인

코드 복사 코드는 다음과 같습니다.

mem=`GetMem $PID`                                                                                     if [ $mem -gt 1600 ]
그럼
{
echo “메모리 사용량이 1.6G보다 큽니다.”
}
그렇지 않으면
{
echo “메모리 사용량은 정상입니다”
}
안녕

샘플 데모:

1) 소스 프로그램 (위에서 CFTestApp의 프로세스 ID를 11426으로 쿼리했다고 가정)


코드 복사 코드는 다음과 같습니다.
mem=`GetMem 11426`

echo "메모리 사용량은 $mem M입니다."

만약 [ $mem -gt 1600 ]
그럼
{
echo "메모리 사용량이 1.6G보다 큽니다."
}
그렇지 않으면
{
echo "메모리 사용량은 정상입니다"
}
안녕

2) 결과 출력

코드 복사 코드는 다음과 같습니다.
메모리 사용량은 248M
메모리 사용량은 정상입니다
[dyu@xilinuxbldsrv 쉘]$

3) 결과 분석

위 출력에서 ​​볼 수 있듯이 CFTestApp 프로그램의 현재 메모리 사용량은 248M이며 이는 정상이며 1.6G 경보 제한을 초과하지 않습니다.

프로세스 핸들 사용 감지

애플리케이션 서비스를 유지 관리할 때 과도한 핸들 사용으로 인해 업무 중단이 발생하는 경우가 많습니다. 각 플랫폼에서 프로세스 핸들의 사용은 제한되어 있습니다. 예를 들어 Linux 플랫폼에서는 ulimit –n 명령(파일 열기(-n) 1024)을 사용하거나 /etc/security/limits.conf의 내용을 볼 수 있습니다. 프로세스 핸들 제한을 가져옵니다. 과도한 핸들 사용은 과도한 부하, 핸들 누수 등으로 인해 발생할 수 있습니다. 업무 프로세스의 핸들 사용은 스크립트를 통해 지속적으로 모니터링되며, 이상 발생 시 적시에 알림(예: SMS를 통해)을 전송하여 유지 관리 담당자가 확인할 수 있습니다. 적시에 처리하십시오. 다음 함수는 지정된 프로세스 ID에 대한 프로세스 핸들 사용량을 가져옵니다. 프로세스 ID에 대한 매개변수가 하나 있습니다. 먼저 ls를 사용하여 프로세스 핸들 정보를 출력한 다음 wc -l을 사용하여 출력 핸들 수를 계산합니다.

코드 복사 코드는 다음과 같습니다.
함수 GetDes
{
DES=`ls /proc/$1/fd wc -l`
$DES 에코
}

다음 함수는 위 함수 GetDes를 통해 이 프로세스의 핸들 사용량을 얻은 후 조건문을 사용하여 핸들 사용량이 900을 초과하는지 여부를 확인하는 것입니다(실제 상황에 따라 조정 가능). , 알람이 출력되고, 그렇지 않으면 출력이 정상이 됩니다.


코드 복사 코드는 다음과 같습니다.
des=` GetDes $PID`
if [ $des -gt 900 ]
그럼
{
echo “des 개수가 900보다 큽니다.”
}
그렇지 않으면
{
echo “des 개수는 정상입니다”
}
안녕

샘플 데모:

1) 소스 프로그램 (위 쿼리에서 찾은 CFTestApp의 프로세스 ID가 11426이라고 가정)

코드 복사 코드는 다음과 같습니다.

des=`GetDes 11426`

echo "des의 개수는 $des입니다."

만약 [ $des -gt 900 ]
그럼
{
echo "des 개수가 900보다 큽니다."
}
그렇지 않으면
{
echo "des 개수는 정상입니다."
}
안녕

2) 결과 출력

코드 복사 코드는 다음과 같습니다.

데의 수는 528
데스 갯수는 정상입니다
[dyu@xilinuxbldsrv 쉘]$

3) 결과분석

위 출력에서 ​​볼 수 있듯이 CFTestApp 프로그램의 현재 핸들 사용량은 528이며 이는 정상이며 900 알람 제한을 초과하지 않습니다.

4) 명령어 소개

wc: 지정된 파일의 바이트, 단어, 줄 수를 계산하고 통계 결과를 표시 및 출력합니다. 매개변수: -l은 행 수를 계산합니다. -c는 바이트를 계산합니다. -w 단어 수를 계산합니다.

TCP 또는 UDP 포트가 수신 대기 중인지 확인

포트 감지는 시스템 리소스 감지에서 자주 발생하며, 특히 네트워크 통신 상황에서는 포트 상태 감지가 매우 중요한 경우가 많습니다. 때로는 프로세스, CPU, 메모리 등은 정상적인 상태인데 포트가 비정상 상태가 되어 비즈니스가 정상적으로 운영되지 않는 경우가 있습니다. 다음 함수는 지정된 포트가 수신 대기 중인지 여부를 확인할 수 있습니다. 감지할 포트에 대한 매개변수가 있습니다. 먼저 netstat를 사용하여 포트 점유 정보를 출력한 다음 grep, awk 및 wc를 통해 수신 대기 중인 TCP 포트 수를 필터링합니다. 두 번째 명령문은 모니터링하는 UDP 포트 수를 출력합니다. .TCP 및 UDP 포트 수신이 모두 0이면 0을 반환하고, 그렇지 않으면 1을 반환합니다.

목록 6. 포트 감지

코드 복사 코드는 다음과 같습니다.

기능 듣기
{
TCPListeningnum=`netstat -an | grep ":$1 " | awk '$1 == "tcp" && $NF == "LISTEN" {print $0}' wc -l`
UDPListeningnum=`netstat -an|grep ":$1 " n
|awk '$1 == "udp" && $NF == "0.0.0.0:*" {print $0}' wc -l`
(( Listeningnum = TCPListeningnum UDPListeningnum ))
만약 [ $Listeningnum == 0 ]
그럼
{
에코 "0"
}
그렇지 않으면
{
에코 "1"
}
파이
}

샘플 데모:
1) 소스 프로그램(예: 포트 8080의 상태를 쿼리하여 수신 중인지 확인)


코드 복사 코드는 다음과 같습니다.
isListen=`8080 듣기`
만약 [ $isListen -eq 1 ]
그럼
{
echo "포트가 수신 중입니다."
}
그렇지 않으면
{
echo "포트가 수신 대기 중이 아닙니다."
}
안녕

2) 결과 출력

코드 복사 코드는 다음과 같습니다.
포트가 듣고 있습니다
[dyu@xilinuxbldsrv 쉘]$


3) 결과분석

위 출력에서 ​​볼 수 있듯이 이 Linux 서버의 포트 8080은 수신 대기 상태입니다.

4) 명령어 소개

netstat: IP, TCP, UDP, ICMP 프로토콜과 관련된 통계 데이터를 표시하는 데 사용됩니다. 일반적으로 머신의 각 포트의 네트워크 연결을 확인하는 데 사용됩니다. 매개변수: -a는 연결의 모든 소켓을 표시합니다. -n 도메인 네임 서버를 통하지 않고 IP 주소를 직접 사용합니다.
다음 함수는 특정 TCP 또는 UDP 포트가 정상 상태인지 여부도 감지합니다.

코드 복사 코드는 다음과 같습니다.

tcp: netstat -an|egrep $1 |awk '$6 == "LISTEN" && $1 == "tcp" {print $0}'
udp: netstat -an|egrep $1 |awk '$1 == "udp" && $5 == "0.0.0.0:*" {print $0}'

명령어 소개

egrep: 파일에서 지정된 문자열을 찾습니다. egrep의 실행 효과는 grep -E와 같습니다. 사용되는 구문과 매개 변수는 grep 명령을 참조할 수 있습니다. grep과의 차이점은 문자열을 해석하기 위해 확장 정규 표현식 구문을 사용하는 반면 grep은 기본 정규 표현식을 사용합니다. 구문, 확장 정규식은 기본 정규식보다 더 완전한 표현식 사양을 갖습니다.

특정 프로세스 이름의 실행 중인 프로세스 수 보기

때때로 서버에서 시작된 프로세스 수를 가져와야 할 수도 있습니다. 다음 함수는 실행 중인 프로세스 수를 감지하는 것입니다. 예를 들어 프로세스 이름은 CFTestApp입니다.

코드 복사 코드는 다음과 같습니다.

Runnum=`ps -ef | grep -v tail | grep "[ /]CFTestApp" | grep -v wc -l
시스템 CPU 부하 감지

서버 유지 관리를 수행할 때 과도한 시스템 CPU(사용률) 부하로 인해 업무 중단이 발생하는 경우가 있습니다. 서버에서 여러 프로세스가 실행 중일 수 있습니다. 단일 프로세스의 CPU를 보는 것은 정상이지만 전체 시스템의 CPU 부하가 비정상적일 수 있습니다. 시스템 CPU 부하를 스크립트를 통해 지속적으로 모니터링하고, 이상 발생 시 적시에 알람을 보내 유지보수 담당자가 적시에 처리하고 사고를 예방할 수 있습니다. 다음 함수는 시스템 CPU 사용량을 감지할 수 있습니다. vmstat를 사용하여 시스템 CPU의 유휴 값을 5회 가져오고 평균을 낸 후 그 차이를 100에서 계산하여 실제 CPU 사용량 값을 가져옵니다.

코드 복사 코드는 다음과 같습니다.
GetSysCPU 함수
{
CpuIdle=`vmstat 1 5 |sed -n '3,$p' n
|awk '{x = x $15} END {print x/5}' |awk -F '{print $1}'
CpuNum=`echo "100-$CpuIdle" bc`
에코 $CpuNum
}

샘플 데모:

1) 소스 프로그램

코드 복사 코드는 다음과 같습니다.
cpu=`GetSysCPU`

echo "시스템 CPU는 $cpu입니다."

if [ $cpu -gt 90 ]
그럼
{
echo "시스템 CPU 사용량이 90%보다 큽니다."
}
그렇지 않으면
{
echo "시스템 CPU 사용량은 정상입니다."
}
안녕

2) 결과 출력


코드 복사 코드는 다음과 같습니다.
시스템 CPU는 87
시스템 CPU 사용량은 정상입니다
[dyu@xilinuxbldsrv 쉘]$

3) 결과 분석

위 출력에서 ​​볼 수 있듯이 현재 Linux 서버 시스템의 CPU 사용률은 87%이며 이는 정상이며 90% 경보 제한을 초과하지 않습니다.

4) 명령어 소개

vmstat: Virtual Meomory Statistics(가상 메모리 통계)의 약자로 운영체제의 가상 메모리, 프로세스, CPU 활동을 모니터링할 수 있습니다.
매개변수: -n은 출력 헤더 정보가 주기적인 루프 출력 중에 한 번만 표시됨을 나타냅니다.

시스템 디스크 공간 확인

시스템 디스크 공간 감지는 시스템 리소스 감지의 중요한 부분입니다. 시스템 유지 관리 중에 서버 디스크 공간 사용량을 확인해야 하는 경우가 많습니다. 일부 기업에서는 수시로 통화 메모, 로그 또는 임시 파일을 작성해야 하기 때문에 디스크 공간을 모두 사용하면 업무 중단이 발생할 수도 있습니다. 다음 기능은 현재 시스템에서 디렉토리의 디스크 공간 사용량을 감지할 수 있습니다. 입력 매개변수 감지해야 하는 디렉토리 이름에 대해 df를 사용하여 시스템 디스크 공간 사용량 정보를 출력한 다음 grep 및 awk를 통해 필터링하여 특정 디렉토리의 디스크 공간 사용량 비율을 얻습니다.

코드 복사 코드는 다음과 같습니다.

GetDiskSpc 함수
{
만약 [ $# -ne 1 ]
그럼
1개 반환
파이

폴더="$1$"
DiskSpace=`df -k |grep $Folder |awk '{print $5}' |awk -F% '{print $1}'
에코 $DiskSpace
}

샘플 데모:

1) 소스 프로그램(탐지 디렉터리는 /boot)


코드 복사 코드는 다음과 같습니다.

폴더="/부팅"

DiskSpace=`GetDiskSpc $Folder`

echo "시스템 $Folder 디스크 공간은 $DiskSpace%입니다."

if [ $DiskSpace -gt 90 ]
그럼
{
echo "시스템 디스크($Folder) 사용량이 90%를 초과했습니다."
}
그렇지 않으면
{
echo "시스템 디스크($Folder) 사용량은 정상입니다."
}
안녕

2) 결과 출력

코드 복사 코드는 다음과 같습니다.

시스템/부팅 디스크 공간은 14%
시스템 디스크(/boot)의 사용은 정상입니다
[dyu@xilinuxbldsrv 쉘]$

3) 결과분석

위 출력에서 ​​이 Linux 서버 시스템의 /boot 디렉터리에 있는 디스크 공간의 14%가 사용되었음을 알 수 있습니다. 이는 정상이며 90% 사용 경보 제한을 초과하지 않습니다.

4) 명령어 소개

df: 파일 시스템의 디스크 공간 사용량을 확인합니다. 이 명령을 사용하면 하드 디스크가 얼마나 많은 공간을 차지하고 있는지, 현재 남은 공간은 얼마나 되는지 등의 정보를 얻을 수 있습니다. 매개변수: -k k 바이트로 표시합니다.

요약

Linux 플랫폼에서 쉘 스크립트 모니터링은 서버와 프로세스를 모니터링하는 매우 간단하고 편리하며 효과적인 방법입니다. 시스템 개발자와 프로세스 유지관리자에게 매우 유용합니다. 위 정보를 모니터링하고 알람을 보낼 수 있을 뿐만 아니라 프로세스 로그 및 기타 정보도 모니터링할 수 있습니다. 이 기사가 모든 사람에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.