Docker 백그라운드에서 무한 루프를 테스트하시나요?

Docker 백그라운드에서 무한 루프를 테스트하시나요?

내 Docker 이미지에서 백그라운드 대기열을 실행하고 싶습니다.

php artisan queue:work --daemon --sleep=1 --tries=3 &

그 직후에는 httpdPHP laravel애플리케이션을 실행하는 Apache가 시작됩니다. 애플리케이션이 laravelRedis에 푸시 알림을 보냅니다. 백그라운드 큐 작업자는 Redis에서 메시지를 수집하여 푸시 서비스를 통해 보냅니다.

이것은 매초마다 작동하고 로그 아웃됩니다. 백그라운드 명령이 충돌하면 다시 시작하고 싶습니다. 이 답변에 따르면https://unix.stackexchange.com/a/223780/72040다음과 같이 백그라운드에서 명령을 무한히 실행할 수 있습니다.

while true; do php $QUEUE_WORK; done &

이를 테스트하기 위해 컨테이너를 실행한 docker rundocker exec -it로그인하여 다음을 살펴보았습니다.

UID        PID  PPID  C STIME TTY          TIME CMD
100000       1     0  0 19:55 ?        00:00:00 httpd -D FOREGROUND
100000      21     1  0 19:55 ?        00:00:00 /bin/sh -e /tmp/scripts/run
100000      22    21  1 19:55 ?        00:00:01 php artisan queue:work --sleep=1 --tries=3
100000      43     1  0 19:55 ?        00:00:00 /usr/bin/cat
100000      50     1  0 19:55 ?        00:00:00 /usr/bin/cat
100000      51     1  0 19:55 ?        00:00:00 /usr/bin/cat
100000      52     1  0 19:55 ?        00:00:00 /usr/bin/cat
100000      53     1  0 19:55 ?        00:00:00 httpd -D FOREGROUND
...
100000     130     0  1 19:57 pts/0    00:00:00 /bin/bash
100000     144   130  0 19:57 pts/0    00:00:00 ps -efww

그런 다음 실행하여 kill 22출력을 확인합니다 docker run.

/tmp/scripts/run: line 10:    22 Killed                  php $QUEUE_WORK

루핑은 프로세스를 계속 실행하지 않습니다. 루프가 이미지에서 실행되는 코드인지 다시 확인했습니다. 루프를 "echo x: sleep 1"로 실행하면 정상적으로 작동합니다.

명령을 종료해도 루프가 명령을 대체하지 않는 이유는 무엇입니까?

노트:애플리케이션은 Kubernetes에서 여러 포드로 배포되며 httpd상태 확인 URL이 오류를 반환하거나 시간 초과되면 모니터링되고 자동으로 다시 시작됩니다.

큐 작업자를 별도의 포드나 사이드카 컨테이너로 배포하고 싶지 않고, 구성이 전혀 없는 애플리케이션 코드를 공유 httpd하도록 컨테이너에서 백그라운드 프로세스로 실행하고 싶습니다.httpd

나는 프로세스 모니터나 기타 도구나 기술을 실행하여 "상태를 유지"하는 데 관심이 없습니다.

내 질문은 Bash 루프가 kill실행 중인 프로세스를 종료하는 이유는 무엇입니까?

답변1

설정

다음과 같이 설정되어 있습니다 Dockerfile.

$ more Dockerfile
From centos
ADD run.sh /tmp/run.sh
RUN chmod +x /tmp/run.sh
ENTRYPOINT ["/tmp/run.sh"]

설정 스크립트, run.sh:

$ cat run.sh
while true; do sleep 15 ; echo "background"; done &

while true; do sleep 12 ; echo "foreground"; done

빌드하세요:

$ docker build -t sleeper .
Sending build context to Docker daemon 7.791 MB
Step 1/4 : FROM centos
 ---> 49f7960eb7e4
Step 2/4 : ADD run.sh /tmp/run.sh
 ---> b4099de53780
Removing intermediate container 1ce8e3a1dac5
Step 3/4 : RUN chmod +x /tmp/run.sh
 ---> Running in e410429a6cba

 ---> 06789467e636
Removing intermediate container e410429a6cba
Step 4/4 : ENTRYPOINT /tmp/run.sh
 ---> Running in ad8b847b505f
 ---> a2415df63f99
Removing intermediate container ad8b847b505f
Successfully built a2415df63f99

그런 다음 시작하십시오.

$ docker run -dit sleeper
28c19c338e6e6177529cf989f42c7f14b17f1c705a61f5244d5350f0ab8f8364

그런 다음 반복적으로 실행되어 다음을 표시합니다.

foreground 
background 
foreground 
background

이제 이를 보면 sleep명령이 결국 "종료"되지만 여전히 실행 중임을 알 수 있습니다.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
28c19c338e6e        sleeper             "/tmp/run.sh"       About a minute ago   Up About a minute                       focused_lumiere

위에서 우리는 이 컨테이너가 1분 이상 시작된 것을 볼 수 있습니다. ps auxf컨테이너 내부는 이렇게 생겼습니다 .

$ ps auxf
...
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        24  0.0  0.1  11828  2964 pts/1    Ss   16:00   0:00 /bin/bash
root        58  0.0  0.1  51712  3432 pts/1    R+   16:01   0:00  \_ ps auxf
root         1  0.0  0.1  11692  2572 pts/0    Ss+  15:58   0:00 /bin/bash /tmp/
root         5  0.0  0.1  11696  2272 pts/0    S+   15:58   0:00 /bin/bash /tmp/
root        56  0.0  0.0   4368   636 pts/0    S+   16:01   0:00  \_ sleep 15
root        57  0.0  0.0   4368   664 pts/0    S+   16:01   0:00 sleep 12

sleep 15이제 다음과 같이 배경을 취소하면:

$ kill 56

그리고 또 다른 것을 실행하십시오 docker ps:

$ docker ps
...
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        24  0.0  0.1  11828  2964 pts/1    Ss   16:00   0:00 /bin/bash
root        60  0.0  0.1  51712  3344 pts/1    R+   16:01   0:00  \_ ps auxf
root         1  0.0  0.1  11692  2572 pts/0    Ss+  15:58   0:00 /bin/bash /tmp/
root         5  0.0  0.1  11696  2272 pts/0    S+   15:58   0:00 /bin/bash /tmp/
root        59  0.0  0.0   4368   636 pts/0    S+   16:01   0:00  \_ sleep 15
root        57  0.0  0.0   4368   664 pts/0    S+   16:01   0:00 sleep 12

sleep 15백그라운드 프로세스를 보호하는 while 루프가 작업을 완료하고 다른 프로세스를 다시 시작한 것을 볼 수 있습니다 sleep 15.

관련 정보