2010-12-17 4 views
2

짧은 간격으로 여러 번 호출 될 수있는 스크립트 (show_volume.sh)를 작성하고 있습니다. 이 스크립트의 인스턴스가 하나 이상 실행 중인지 여부를 확인하는 방법이 필요합니다. 나는 ps를 사용할 수있는 생각, 그래서 나는 배쉬에서이 기능을 썼다 : ps를 사용하여 실행중인 스크립트 수를 확인하십시오.

is_only_process(){ 
    PCOUNT=`ps -a | grep show_volume.sh | wc -l` 
    echo $PCOUNT 
    if ((PCOUNT==1)); then 
     return 1 
    fi 
    return 0 
} 

그래서 내가 추가 한 다음 2 줄

is_only_process 
sleep 4 

을 한 번이 스크립트를 시작했지만, echo $PCOUNT의 출력이 어떤을하지 않습니다 나 한테 감각이있어. 나는 항상 예상대로 2가 아니라 1을 얻는다. 스크립트가 실행되는 동안 나는 다른 터미널에서이 명령

ps -a | grep show_volume.sh | wc -l

을 실행할 때, 나는 1 그것의 거의 같은 내가 행에서이 스크립트를 여러 번 실행할 때, 예를 들어, 값을받을 for 루프를 사용하여 10 번. 스크립트 자체가 너무 높은 값을 결정하는 동안 다른 터미널을 사용할 때 올바른 값을받습니다.

이제이 스크립트가이 홀수 값을 결정하는 이유는 무엇입니까?

답변

6

grep show_volume.sh 또한 실행중인 프로세스를 실행하는 예를 들어,뿐만 아니라 그렙을 제외하려고, 그래서 당신은 항상 그렙를 계산!

간단한 해결책, grep s[h]ow_volume.sh. grep (셸이 아님)은 [h]h으로 축소하고 원하는 것을 검색하지만 grep은 매개 변수에 []가 있기 때문에 grep 자체가 일치하지 않습니다.

pgrep도이 작업에 유용하며 항상 자신을 제외시킬만큼 똑똑합니다.

+0

@ Nathan +1 멋진 트릭! – khachik

+0

"ps가 프로세스 grep show_volume.sh도 실행 중일 때 - 기술적으로 올바르지 않습니다. grep이 실행되기 전에'ps'가 종료되는 경우가 있는데,이 경우'grep '은 계산되지 않습니다. 그래서 두 가지 경우 모두를 만족시켜야합니다. – marcog

+0

웬일인지, 그것은 나의 문제를 해결하지 않는다.표현식을'pgrep show_volume.sh | wc -l' 또는'ps -a | grep s [h] ow_volume.sh | wc -l'하지만 스크립트는 이전과 똑같이 작동합니다. – helios35

1

당신 그렙 자체도 show_volume.sh 들어 있으므로 순간 ps에서

ps -a | grep show_volume.sh | grep -v grep | wc -l 
+0

감사합니다, 그러나 이것은 스크립트의 동작을 변경하지 않습니다. 여전히 같은 오류가 발생합니다. – helios35

1

다른 사용자로 스크립트를 실행하는 경우 ps -a은 현재 사용자 및 연결된 터미널이있는 인스턴스 만 표시합니다. ps -ax 또는 ps -e을 사용하십시오.

pgrep -c 

wc을 사용하지 않고 개수를 표시합니다.

0

ajreal이 제공하는 솔루션 :

ps -a | grep show_volume.sh | grep -v grep | wc -l

해야합니다. 그렇지 않으면 출력을 제공하십시오

ps -a | grep show_volume.sh | 그렙 -v 그렙

여기

+1

출력 : "ps -e | grep show_volume.sh | grep -v grep" 15956? 00:00:00 show_volume.sh 15971? 00:00:00 show_volume.sh 스크립트를 한 번만 실행하고 grep을 제외했지만 두 개의 프로세스가 있습니다. – helios35

+0

'grep -v grep'는 반 패턴입니다. 그것을 피하는 방법은 고대의 FAQ입니다. – tripleee

관련 문제