쉘 스크립트에서 실행 중인 프로세스를 감지하는 데 문제가 있습니다.

쉘 스크립트에서 실행 중인 프로세스를 감지하는 데 문제가 있습니다.

스크립트:

#!/bin/bash
kafka=`ps -ef | grep 'kafka' | grep -v grep | wc -l`
echo $kafka
if [ $kafka<3 ]
then
echo "Hi Support Team,

Kafka is down on QA/Dev server $hostname .Please take immediate action

Regards,
Application Support Team"| mailx -s "Kafka down on QA/Dev server" [email protected]
fi

산출:

-bash-4.2$ ./mail.sh
2
./mail.sh: line 4: 3: No such file or directory

답변1

따옴표가 없는 <연산자는 셸의 리디렉션 연산자입니다. 이 오류는 셸이 이라는 파일에서 리디렉션을 시도하고 있음을 나타냅니다 3. 두 정수를 비교 하는 데 이를 사용하고 싶을 가능성이 높습니다 -lt.

대체 구현은 다음과 같습니다.

#!/bin/sh

if ! pkill -0 kafka; then
    mail -s 'Kafka down on QA/Dev server' [email protected] <<END
Hi Support Team,

Kafka is down on QA/Dev server $hostname.
Please take immediate action

Regards,
Application Support Team
END
fi

pkill위의 스크립트는 각 프로세스에 "제로 신호"를 보내는 데 사용됩니다 kafka( 명령 이름뿐만 아니라 pkill -0 -f kafka전체 명령줄에서 하위 문자열을 검색하는 데 사용됨). kafka그러한 프로세스가 없으면 pkill0이 아닌 종료 상태로 종료되어 이메일 전송이 트리거됩니다. "제로 신호"는 프로세스가 존재하고 프로세스에 아무런 영향을 미치지 않는지 테스트하는 데 사용됩니다.

또는 프로세스 수를 계산 kafka하고 3개 미만일 때 이메일을 트리거하려면 다음을 수행하세요.

#!/bin/sh

if [ "$( pgrep kafka | wc -l )" -lt 3 ]; then
    mail -s 'Kafka down on QA/Dev server' [email protected] <<END
Hi Support Team,

Kafka is down on QA/Dev server $hostname.
Please take immediate action

Regards,
Application Support Team
END
fi

pgrep호출은 주어진 패턴과 일치하는 모든 프로세스 이름의 프로세스 ID를 한 줄에 하나씩 인쇄합니다. 명령 이름뿐만 아니라 전체 명령줄에서 하위 문자열을 pgrep -f kafka검색하는 데 사용됩니다 .kafka

위의 두 스크립트 모두 변수가 hostname설정되어 스크립트 외부로 내보내졌다고 가정합니다. $(hostname)를 사용하여 여기에 설명된 유틸리티를 $hostname호출 할 수 있습니다 .hostname

관련 정보