2014-04-23 37 views
1

我在Google Compute Engine上的Linux(Debian Whisky)服務器上啓動了Django 1.6。我已經在後臺運行了Celery 3.1以幫助處理一些進程。當我開始一個新實例(使用我創建的快照)時,我總是需要啓動Celery。我正在尋找一種在服務器加載時自動啓動Celery的方法。如果服務器決定重新啓動,這一點特別有用,因爲他們似乎現在就這樣做了。要做到這一點,我已經編輯了rc.local文件:從Django應用程序內自動啓動Celery

$ sudo nano /etc/rc.local 

它用來包含以下內容:

exit 0 
[ -x /sbin/initctl ] && initctl emit --no-wait google-rc-local-has-run || true 

我編輯的文件,使得它現在讀取:

cd /home/user/gce_app celery -A myapp.tasks --concurrency=1 --loglevel=info worker > output.log 2> errors.log & 
exit 0 
[ -x /sbin/initctl ] && initctl emit --no-wait google-rc-local-has-run || true 

該目錄:

/home/user/gce_app 

是我的Django項目所在的目錄以及我需要啓動Celery的目錄。然而,在重新啓動實例後,當我輸入:

$ celery status 
Error: No nodes replied within time constraint. 

打開errors.log文件,我看到:

/etc/rc.local: 14: /etc/rc.local: celery: not found 

肯定的cd在該代碼串的開頭應該解決這個問題?有沒有一種方法(在Django項目本身內)在啓動項目時啓動Celery實例,以使代碼更加平臺無關並且不受不可避免的OS更新的影響?

回答

0

既然你似乎可以用暴發戶,這可能幫助你:

description "runs celery" 
start on runlevel [2345] 
stop on runlevel [!2345] 

console log 
env VENV='/srv/myvirtualenv' 
env PROJECT='/srv/run/mydjangoproject' 

exec su -s /bin/sh -c 'exec "$0" "[email protected]"' www-data -- /usr/bin/env PATH=$VENV:$PATH  $VENV/python $PROJECT/manage.py celeryd 

respawn 
respawn limit 10 5 
+0

小心這裏重生。我不會那麼用,芹菜工人的設計很健壯。請參閱這些[celery init](https://github.com/celery/celery/tree/3.1/extra/generic-init.d/)腳本。 –

1

我認爲你缺少你「CD」和芹菜調用之間以分號。另外,我懷疑rc.local可能不會搜索你的路徑,所以你可能需要給芹菜絕對路徑。例如

cd /home/user/gce_app; /usr/bin/celery ...

或者,你可以看看使用startup script from the GCE metadata避免無需修改rc.local中。

+0

謝謝你的評論 - 我會嘗試包括分號。這裏的關鍵是找到一種由django應用程序啓動芹菜的方法。我並不熱衷於被鎖定到GCE或任何其他回聲系統 - 所以如果有辦法將啓動請求與django應用程序本身綁定在一起,那將非常棒。 – user714852