저는 기본 시작 시스템이 runit인 시스템을 개발 중입니다.
불행하게도 runit은 실행되는 모든 애플리케이션이 다음과 같이 포그라운드에서 실행되도록 요구합니다.
#!/bin/bash
exec sshd -D
sv
nginx는 포그라운드에서 실행하는 방법을 제공하지 않으므로 runit이 nginx를 계속 관리하고 runit의 명령을 사용하여 nginx를 중지, 시작 및 다시 시작할 수 있도록 하려면 어떻게 해야 합니까 ?
답변1
옵션을 사용할 수 있습니다 daemon off
.
exec /usr/sbin/nginx -c /etc/nginx/nginx.conf -g "daemon off;"
~에서Nginx 위키:
runit/daemontools를 사용하여 프로덕션 모드에서 daemon off를 안전하게 사용할 수 있지만 일반적인 업그레이드는 수행할 수 없습니다. master_process off는 프로덕션에서 사용하면 안 됩니다.
runit
제어를 사용하면 nginx
기본 프로세스의 상위 프로세스가 됩니다 nginx
. 그러나 온라인 업그레이드를 시도하면 nginx
기본 프로세스가 새 바이너리를 포크하고 실행합니다.
새 마스터 프로세스가 생성되었지만 이전 마스터 프로세스가 여전히 존재하기 때문에(제어되기 때문에 runit
) 새 마스터 프로세스의 상위 프로세스는 init 프로세스가 됩니다. runit
새 마스터 프로세스가 시작되지 않았기 때문에 제어할 수 없기 때문입니다. .
답변2
실제 세계에서 사용하는 모든 것의 기본 프로세스를 종료하지 마십시오. 가동 중지 시간 없는 업그레이드가 수행되지 않으며 지원되지 않습니다.
포트 80 등을 모니터링하려면 페이지 센트리를 사용하세요. 올바른 방법으로 수행하고, 마법 같은 것을 포함하지 마세요. 그렇지 않으면 nginx가 가동 중지 시간 없는 업그레이드를 수행할 수 없으며 아마추어처럼 보일 것입니다.
# . . .
set -e
## config - start - should move to another file
CONF='/etc/nginx/nginx.conf'
# TODO: grab below by parsing CONF
PROTO=http
IP=0.0.0.0
PORT=80
## config - end - should move to another file
case "$(uname | tr '[A-Z]' '[a-z]')" in
darwin|freebsd|netbsd|openbsd) NC_ARGS="-n -w 5 -z '${IP}' '${PORT}'" ;;
linux) NC_ARGS="-n -w 5 --send-only '${IP}' '${PORT}'" ;;
*) echo "unsupported os $(uname)" >&2; exit 1 ;;
esac
/usr/bin/nginx -t -c "${CONF}"
/usr/bin/nginx -c "${CONF}"
sleep 5
while /usr/bin/nc $NC_ARGS </dev/null >/dev/null 2>&1; do
set -e # loop runs in a subshell
/usr/bin/curl -m5 -fsS -A 'runit script/0.0.0' \
"${PROTO}"://"${IP}":"${PORT}" | \
/usr/bin/grep -q 'This comment is required'
sleep 2
done