以 Supervisord 子程序執行 shell 腳本?

以 Supervisord 子程序執行 shell 腳本?

我有一個 Django 1.6.2 應用程序,它使用 Celery 3.1.7 來執行非同步任務。我正在使用 Supervisor 啟動我的 Celery 工作人員。到目前為止,除了我重新啟動 Debian 7.8 伺服器之外,一切都運作良好。發生這種情況時,我的 Celery 工作人員將不會重新啟動,因為當伺服器重新啟動時,它將 celery 日誌檔案的所有權從我的「celery」使用者變更為「root」。另外,系統刪除了我在其中寫入 pid 檔案的 /run/celery 目錄。如果我手動進行這些變更並重新啟動 Celery,我的所有工作人員都會正常啟動。

由於這些變更需要在啟動工作程序之前進行,我認為解決方案是編寫一個 shell 腳本,由於其優先順序較高,該腳本在 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. 這是在 celery 工作程序重新啟動之前更改我的工作程序日誌權限並重新建立 pid 目錄的正確方法嗎?

  2. 如果這是正確的方法,為什麼它不起作用?如果不是,正確的方法是什麼?

  3. 如果我使用 init.d celeryd 守護程式腳本而不是 Supervisor,那麼有一個CELERY_CREATE_DIRS設定將自動建立使用者/群組擁有的 pid 和日誌目錄。使用supervisord時有沒有辦法複製這個設定?

一方面,我知道 Supervisor 只能在前台進程上使用,但腳本並非如此。另一方面,我在這裡看到了其他問題,這些問題似乎暗示您應該能夠從 Supervisor 運行 shell 腳本。

感謝您的幫助。

# 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

相關內容