programing

감독 된 하위 프로세스 중지

nasanasas 2021. 1. 11. 08:18
반응형

감독 된 하위 프로세스 중지


supervisord가 직면 한 문제 중 하나는 다른 프로세스를 생성하는 명령이있을 때 supervisord가이를 죽일 수 없다는 것입니다.

예를 들어 정상적으로 실행될 때 다음과 같은 Java 프로세스가 있습니다.

 $ zkServer.sh start-foreground
 $ ps -eaf | grep zk
 user 30404 28280  0 09:21 pts/2    00:00:00 bash zkServer.sh start-foreground
 user 30413 30404 76 09:21 pts/2    00:00:10 java -Dzookeeper.something..something

감독 된 구성 파일은 다음과 같습니다.

[program:zookeeper]
command=zkServer.sh start-foreground
autorestart=true
stopsignal=KILL

여러 자식이있는 이러한 종류의 프로세스는에서 중지 할 때 감독자가 잘 처리하지 못합니다 supervisorctl. 따라서 supervisord에서 이것을 실행하고 supervisorctl에서 중지하려고하면 최상위 프로세스 만 종료되고 실제 Java 프로세스는 종료되지 않습니다.


Rick Hanlon II에서도 동일한 문제가 발생했습니다. https://coderwall.com/p/4tcw7w

supervisord가 상위 프로세스뿐만 아니라 하위 프로세스도 중지하려면 프로그램 섹션에서 stopasgroup = true 옵션을 설정해야합니다.

예제는 다음과 같습니다.

[program:some_django]
 command=python manage.py runserver
 directory=/dir/to/app
 stopasgroup=true

또한 "stopasgroup"기능이없는 이전 supervisord 패키지가있을 수 있습니다. Raspberry Pi에서 다음 Debian 패키지를 시도했습니다.

  • supervisor_3.0a8이 작동하지 않습니다.

  • supervisor_3.0b2-1이 예상대로 작동합니다.

supervisord가 호출 한 기본 bash 스크립트에서 초기에 다음을 수행하면 문제가 해결되었습니다.

trap "kill -- -$$" EXIT

이렇게하면 supervisord에 의해 종료되는 경우와 같이 기본 스크립트가 종료 될 때 전체 프로세스 그룹이 종료됩니다.


SIGKILL을 전체 프로세스 그룹에 보내는 기능이 최근 supervisord에 추가되었습니다. 이 글은 다음의 github에 있지만 아직 공식적으로 발표되지.

파일에서 프로세스 ID를 사용할 수있는 경우 pid-proxy 프로그램을 사용할 수 있습니다.


다음 기사에는 문제에 대한 심층적 인 논의가 있습니다.

http://veithen.github.io/2014/11/16/sigterm-propagation.html


이 감독자 프로그램 구성을 시도하십시오.

stopasgroup=true
killasgroup=true
stopsignal=INT

/conf.d/your-configuration.conf파일 에서 우선 순위를 사용할 수도 있습니다 . 예를 들어 zookeeper를 먼저 실행 한 다음 kafka를 실행하려면 두 개의 프로그램을 지정할 수 있습니다.

낮은 우선 순위는 프로그램이 먼저 시작되고 마지막에 중지됨을 의미합니다.

참조 URL : https://stackoverflow.com/questions/9090683/supervisord-stopping-child-processes

반응형