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
프로세스 만 종료하려면 pkill
with 를 사용 -o
하고 -n
최신 프로세스만 종료하세요. pkill
설명서 를 참조하세요 .
또한 참고하시기 바랍니다
variable=$( echo `somecommand` )
다음과 같이 쓰는 것이 더 낫다
variable=$( some_command )
쉘이 결과에 따라 토큰화 및 파일 이름 확장을 수행한다는 사실에 의존하지 않는 한 some_command
(사용자는 그렇지 않습니다).