`ps -ef`가 작동하려면 (nohup'ed) 스크립트가 최대 절전 모드로 전환되어야 하는 이유는 무엇입니까?

`ps -ef`가 작동하려면 (nohup'ed) 스크립트가 최대 절전 모드로 전환되어야 하는 이유는 무엇입니까?

다음 줄을 포함하고 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

관련 정보