쉘 스크립트를 Supervisord 하위 프로세스로 실행하시겠습니까?

쉘 스크립트를 Supervisord 하위 프로세스로 실행하시겠습니까?

비동기 작업에 Celery 3.1.7을 사용하는 Django 1.6.2 애플리케이션이 있습니다. Supervisor를 사용하여 Celery 작업자를 시작하고 있습니다. 지금까지는 데비안 7.8 서버를 재부팅할 때를 제외하고는 모든 것이 잘 작동하고 있습니다. 그런 일이 발생하면 서버가 재부팅될 때 셀러리 로그 파일의 소유권이 내 "celery" 사용자에서 "root"로 변경되므로 Celery 작업자가 다시 시작되지 않습니다. 또한 시스템은 내가 pid 파일을 작성하는 /run/celery 디렉토리를 삭제합니다. 직접 변경하고 Celery를 다시 시작하면 모든 작업자가 정상적으로 시작됩니다.

이러한 변경 사항은 작업자를 시작하기 전에 발생해야 하므로 우선 순위가 높기 때문에 셀러리 작업자 명령 전에 내 Supervisor.conf 스크립트에서 실행되는 셸 스크립트를 작성하는 것이 해결책이라고 생각했습니다(아래 참조).

그러나 이 설정 스크립트는 실행되지 않습니다. 내 감독관 기록에는 다음과 같이 적혀 있습니다.

exited: celery-setup (exit status 0; not expected)
gave up: celery-setup entered FATAL state, too many start retries too quickly.

또한 stdout/err 로그 파일에 오류가 기록되지 않습니다.

내 질문은 다음과 같습니다

  1. 셀러리 작업자를 다시 시작하기 전에 작업자 로그 권한을 변경하고 pid 디렉터리를 다시 생성하기 위해 취하는 올바른 접근 방식입니까?

  2. 이것이 올바른 접근 방식이라면 왜 작동하지 않습니까? 그렇지 않다면 올바른 접근 방식은 무엇입니까?

  3. Supervisor 대신 init.d celeryd 데몬 스크립트를 사용하고 있다면CELERY_CREATE_DIRS사용자/그룹이 소유하는 pid 및 log 디렉터리를 자동으로 생성하는 설정입니다. Supervisord를 사용할 때 이 설정을 복제할 수 있는 방법이 있습니까?

한편으로는 Supervisor가 포그라운드 프로세스에서만 사용되어야 한다는 것을 알고 있는데, 이 스크립트에서는 그렇지 않습니다. 반면에 Supervisor에서 쉘 스크립트를 실행할 수 있어야 한다는 것을 암시하는 다른 질문을 여기에서 보았습니다.

당신의 도움을 주셔서 감사합니다.

# celery-supervisor-setup
#!/bin/bash

for i in 1 2 3
do
    if [ -f "/var/log/celery/worker${i}.log" ]; then
        echo "processing $i"
        chown celery:celery /var/log/celery/worker${i}.log
    fi
done

if [ ! -d "/run/celery" ]; then
    mkdir /run/celery
    chown celery:celery /run/celery
fi

# /etc/supervisor/conf.d/supervisor.conf
[program:celery-setup]
command = /www/myproj/conf/celery-supervisor-setup
; This next command didn't work
;command = bash -c " /www/myproj/conf/celery-supervisor-setup"
user = root
stdout_logfile = /var/log/celery_setup_stdout.log
stderr_logfile = /var/log/celery_setup_stderr.log
redirect_stderr = true
autostart = true
autorestart = false
priority=997

[program:celeryw1]
command=/home/myproj/venv/myproj/bin/celery worker --app=conf.celeryapp:app -n worker1 --config=celeryconfig -Q default --loglevel=info --pidfile=/var/run/celery/worker1.pid
directory=/www/myproj
user=celery
numprocs=1
stdout_logfile=/var/log/celery/worker1.log
stderr_logfile=/var/log/celery/worker1.log
redirect_stderr=true
autostart=true
autorestart=true
startsecs=1
stopwaitsecs=600
killasgroup=true
priority=998

; Note that I have "celeryw2" and "celeryw3" subprocess groups that are similar
; to the above except they refer to workers 2 and 3.  I omitted them to save space.

[group:celery-workers]
programs=celeryw1,celeryw2,celeryw3
priority=999

관련 정보