2014-06-16 30 views
1

我以一種不尋常的方式使用芹菜 - 我在芹菜啓動時創建自定義過程,這個過程在芹菜運行時應始終運行。 芹菜工人使用這個過程來完成他們的任務(細節不需要)。「celeryd stop」不起作用

我運行命令行芹菜,一切都OK:

celery -A celery_jobs.tasks.app worker -B --loglevel=warning 

但是當我使用celeryd來守護進程芹菜,沒有辦法阻止它。 命令celeryd stop試圖阻止芹菜,但永遠不會結束。

當我在兩種情況下都檢查進程樹時,有一個區別 - 從命令行運行時,父進程明顯是芹菜進程(將芹菜工作者視爲子進程的主進程)。殺死(停止)父芹菜過程將停止所有芹菜工和我的定製過程。

但隨着celeryd運行的時候,我的自定義過程有家長/sbin/init - 並調用celeryd stop不工作 - 好像主芹菜進程正在等待的東西,或者是無法阻止我自定義的過程,因爲它是不芹菜子進程。

我對流程瞭解不多,而且找到信息並不容易,因爲我不知道應該搜索什麼內容,所以有必要提供任何提示。

回答

0

我假設你的自定義進程不是你的任何池工作進程的子進程,不需要這樣做。

我使用supervisord而不是芹菜來守護工人。它也可以用來守護其他進程。比如你的自定義進程。

在你的情況下,你的supervisord.conf可以有多個部分。一個用於每個芹菜工作者節點和一個(或多個)用於您的自定義過程(es)。

當您殺死supervisord進程(使用-TERM)時,它將負責終止所有的工人和您的自定義進程。如果您使用-TERM,那麼您將需要確保您的自定義進程處理它們。

+0

我接受這個答案,因爲我認爲這個解決方案更清潔。 – misoK

1

我有同樣的問題。我需要一個快速的解決方案,所以我寫了這個bash腳本

#/bin/bash 

/etc/init.d/celeryd stop 
sleep 10 
export PIDS=`ps -ef | grep celery |grep -v 'grep' | awk '{print $2}'` 
for PID in $PIDS; do kill -9 $PID; done; 

如果過程沒有10秒後停止,這是一個長期的時間來停止候選人,所以我決定突然停止

+0

感謝您的快速解決,如果我找不到其他解決方案,它可能會有所幫助。 – misoK