다음 줄을 포함하고 ansible(ssh, sudo를 통해)에 의해 호출되는 스크립트에서 약 5번 중 4번은 시도 중이고 프로세스가 영원히 실행 중임 에도 불구 ps
하고 if 분기에 도달합니다 . grep
이 경우 Count:
"0"이 에코됩니다.
PROC=[a]sdf # brackets, so we don't grep the grep process itself
# sleep 0.1
PID=(`ps -ef|grep -E "$PROC"|awk '{print $2}'`)
PIDLEN=`echo "${#PID[@]}"`
if [ "PIDLEN" -ne 1 ]; then
echo \"$PROC\" does not designate a single, unique process. Count: "$PIDLEN"
이제 흥미로운 점은 "sleep 0.1" 행의 주석 처리를 제거하면 if 분기에 도달하지 않는다는 것입니다. 이는 제가 예상한 것입니다.
이 스크립트는 관련이 있을 수 있는 nohup을 사용하여 분리 모드에서 시작됩니다. 스크립트는 다음과 같습니다.
- shell:
cmd: nohup ./script.sh </dev/null >/tmp/out 2>/tmp/err &
고쳐 쓰다
내 질문과 관련이 없지만 댓글에 누군가가 이것이 항상 콤보 pgrep
보다 낫다고 생각하는 것 같습니다. ps|grep
이것이 반드시 그런 것은 아니라는 것을 증명하기 위해 - 이것이 실제로 제가 여기서 pgrep을 사용하지 않는 이유입니다 - 데비안 10에서 이것을 시도해 보십시오:
$ sleep 1000 $(seq 1 1200)|wc -c&
[1] 13821
$ ps -ef|grep [1]200|wc -l
1
$ pgrep -f 1200|wc -l
0
$ pgrep -f 1038|wc -l
1
$ pgrep -f 1039|wc -l
0
$ pgrep -af 1038|wc -c
4102 # 5-digit PID + SPACE + 4096 chars
$ ps -ef|grep [1]200|wc -c
4952
이는 pgrep greps/prints가 프로세스당 4096자만 인쇄하는 반면 ps -ef는 그 이상을 인쇄한다는 것을 보여줍니다. (숫자를 얻기 위해 ps|grepping하는 것은 일반적으로 안전한 일이 아니며, 요점을 증명하기 위해 사용했습니다.)
위의 모든 내용은 이 Dockerfile을 사용하는 누구나 쉽게 확인할 수 있습니다.
FROM debian:10
RUN apt-get clean
RUN apt-get update
RUN apt-get install -y --no-install-recommends procps
다음 명령을 사용하여 빌드하고 실행할 수 있습니다
docker build -t debian10-pgrep-vs-ps .
docker run --rm -it debian10-pgrep-vs-ps