runit 사용자 정의 중지 스크립트를 작성하는 방법 자식 프로세스를

프로세스를 중지 / 다시 시작해야 할 때 실행할 사용자 지정 “중지”스크립트 runit( runsv) 를 갖고 싶습니다 . 현재는 단순히 프로세스를 종료 한 다음 “완료”스크립트를 실행합니다. 그러나 제 경우에는 프로세스가 동적으로 자식 프로세스를 생성하므로 간단하지 않고 프로세스 를 제거 kill해야 "killtree"합니다. 어떻게해야합니까?

나는 그것이 controlrunit 의 옵션을 통해 이루어져야한다는 것을 알고 있지만 문서를 읽음으로써 그 정지 스크립트의 이름을 어떻게 지정 해야하는지는 분명하지 않습니다.

http://smarden.org/runit/runsv.8.html



답변

문서에서

제어 파이프로 전송 된 각 제어 문자 c에 대해 runsv는 먼저 service / control / c가 존재하며 실행 가능한지 확인합니다. 그렇다면 service / control / c를 시작하고 명령을 해석하기 전에 종료 될 때까지 기다립니다. 프로그램이 리턴 코드 0으로 종료되면 runsv는 해당 신호를 서비스에서 전송하지 못하게합니다. 명령 o는 항상 명령 u로 간주됩니다. 명령 d에서 먼저 service / control / t를 점검 한 다음 service / control / d를 점검하십시오. x 명령에서 첫 번째 service / control / t를 확인한 다음 service / control / x를 확인하십시오. 선택적 로그 서비스 제어는 사용자 정의 할 수 없습니다.

즉 , 명령 (아래로) 과 같이 service_name/control/X관련 sv명령을 서비스에 보낼 때 실행되는 실행 파일 인 X 를 작성해야합니다 d. 스크립트가 상태 0으로 종료되면 서비스 자체를 중지하지 않습니다.

기본적으로 /etc/sv/<service>/control/d원하는 것을 수행하고 서비스를 종료하고 pid를 정리하는 등 실행 가능한 스크립트가 필요합니다 .


답변

간단한 대답은 정리 스크립트의 이름을 “service / finish”로 지정하는 것입니다. 이 스크립트는 “service / run”이 종료 될 때 실행됩니다.

“service / control / ctrl_char 인터페이스도 있습니다. runsv에 보내는 명령에 따라 다른 작업을 수행 할 수 있습니다.


답변

도커를 위해이 문제를 직접 해결해야했습니다. uwsgi 서버가 실행 중이며 컨테이너 중지시 docker (INT 대신 TERM)가 잘못된 신호를 보냈습니다.

control / x 파일의 개념은 수신 된 신호에 반응하는 것입니다. 필자의 경우 t종결 신호 파일을 제어에 넣습니다. 신호라는 용어로 예약 된 파일이기 때문입니다. 스크립트는 실행 가능해야합니다.

#!/bin/bash
kill -INT `cat /tmp/project-master.pid`

이 스크립트는 uwsgi 프로세스에 int 신호를 보냅니다.

제어 스크립트가 오류없이 반환되면 (리턴 코드 0) 원래 신호가 프로세스로 전송되지 않습니다.

그래서 내 경우에는 신호라는 용어를 수신하고 대신 int 신호를 서비스 프로세스에 보낼 수있었습니다.