스크립트에서 실행하는 경우 pgrep은 터미널에서 실행하는 경우와 다른 결과를 반환합니다.

스크립트에서 실행하는 경우 pgrep은 터미널에서 실행하는 경우와 다른 결과를 반환합니다.

OpenWrt 기반 시스템에서 실행 중인 프로세스 인스턴스 수를 확인하는 스크립트를 작성했습니다. 터미널에서 다음 명령을 실행하면

COUNT_PS=$(echo `ps -w | grep -v grep | grep upmpdcli | wc -l`)
root@SHAULA-720:~# echo $COUNT_PS

밝혀지다

1

아래는 쉘 스크립트의 코드입니다. 이 스크립트를 실행하면 결과는 1이 아닌 4입니다.

#!/bin/ash

#for debug 
ps -w | grep -v grep | grep upmpdcli



COUNT_PS=$(echo `ps -w | grep -v grep | grep upmpdcli | wc -l`)
echo we have $COUNT_PS instances for upmpdcli;
logger we have $COUNT_PS instances for upmpdcli;

if [[ $COUNT_PS == 1 ]]; then        
    logger "we have only one instance"


 #HERE PUT CODE TO START NEW PROCESS
elif [[ $COUNT_PS == 2 ]]; then
    logger "we have 2 instances lets kill all and start a single"
    kill -9 `pgrep upmpdcli`

elif [[ $COUNT_PS == 0 ]]; then
    logger "we have no instance lets wait for cron to start it"


else
    logger "we have $COUNT_PS  instances"
fi

그래서 실행하면 /etc/upmpd-check.sh결과가 we have 4 instances for upmpdcli이상해 보입니다.

내가 여기서 무엇을 놓치고 있는 걸까요?

여기에 이미지 설명을 입력하세요. 여기에 이미지 설명을 입력하세요.

답변1

주요 혼란은 ps | grep문자열을 포함하는 스크립트 이름과 일치하는 파이프 에서 발생합니다 upmpdcli.

이렇게 하면 기본적 pgrep으로 pgrep명령 이름만 표시 upmpdcli-check되고 upmpdcli.

이상적으로는

pgrep -x /usr/bin/upmpdcli

프로세스의 PID를 가져옵니다.

프로세스를 종료하려면 다음을 사용하십시오.

pkill -x /usr/bin/upmpdcli

즉, ~을 해라아니요PID를 사용하십시오 pgrep(최신 버전이 아닐 수도 있음).

가장 오래된 upmpdcli프로세스 만 종료하려면 pkillwith 를 사용 -o하고 -n최신 프로세스만 종료하세요. pkill설명서 를 참조하세요 .


또한 참고하시기 바랍니다

variable=$( echo `somecommand` )

다음과 같이 쓰는 것이 더 낫다

variable=$( some_command )

쉘이 결과에 따라 토큰화 및 파일 이름 확장을 수행한다는 사실에 의존하지 않는 한 some_command(사용자는 그렇지 않습니다).

관련 정보