다음은 실패하는 최소한의 테스트 케이스입니다.
#!/bin/tcsh
#here is some code in tcsh I did not write which spawns many processes.
#let us pretend that it spawns 100 instances of stupid_test which the user kills
#manually after an indeterminate period
/bin/bash <<EOF
#!/bin/bash
while true
do
if [[ `ps -e | grep stupid_test | wc -l` -gt 0 ]]
then
echo 'test program is still running'
echo `ps -e | grep stupid_test | wc -l`
sleep 10
else
break
fi
done
EOF
echo 'test program finished'
stupid_test 프로그램은 다음과 같이 구성됩니다.
#!/bin/bash
while true; do sleep 10; done
의도 된 동작은 stupid_test가 종료 될 때까지 (이 경우 사용자가 수동으로) 실행 한 다음 10 초 이내에 종료하는 것입니다. 관찰 된 동작은 스크립트가 종료되지 않고 ps -e | grep stupid_test | wc -l
프로그램이 종료 된 후에도 == 1로 평가 된다는 것입니다 (그리고 더 이상 ps 아래에 표시되지 않음).
bash 스크립트가 here 문서가 아닌 직접 실행되면 의도 한 동작이 복구됩니다.
나는 내가 아주 어리석은 일을하고 있다고 느낀다. 나는 가장 경험이 많은 쉘 해커가 아니다. 왜 이러는 거죠?
일반적으로 grep
프로세스의 이름 을 입력하려고하면 다음과 같이 추가로 일치하는 행이 표시 grep
됩니다.
$ ps xa | grep something
57386 s002 S+ 0:00.01 grep something
따라서 매칭 프로세스가없는 경우에도 하나의 매칭 라인을 얻게됩니다. grep -v grep
파이프 라인 에를 추가하여 문제를 해결할 수 있습니다 .
ps -e | grep stupid_test | grep -v grep | wc -l
tripleee가 제안 했듯이 더 나은 수정은 다음 grep
과 같이 작성하는 것입니다.
ps -e | grep [s]tupid_test
패턴의 의미는 정확히 동일하지만 grep
문자열 "grep [s]tupid_test"
이 정규식과 일치하지 않기 때문에 더 이상 자체적으로 일치하지 않습니다 /[s]tupid_test/
.
Btw 나는 당신의 스크립트를 다음과 같이 다시 작성할 것입니다.
/bin/bash <<EOF
while :; do
s=$(ps -e | grep [s]tupid_test)
test "$s" || break
echo test program is still running
echo "$s"
sleep 10
done
EOF
또는 더 게으르지 만 아마도 충분한 변형 ( bryn으로 암시 ) :
/bin/bash <<EOF
while ps -e | grep [s]tupid_test
do
echo test program is still running
sleep 10
done
EOF
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다