当我用新贵运行芹菜时,过了一会儿,孩子的过程或主要过程死亡,没有任何痕迹。
我正在使用的Upstart脚本( /etc/init/celery ):
description "celery" start on runlevel [2345] stop on runlevel [!2345] kill timeout 20 # console log setuid *** setgid *** script chdir /opt/***/project/ exec /opt/***/virtualenvs/***/bin/python manage.py celery worker --settings=settings.staging -B -c 4 -l DEBUG end script respawn
当运行exestly相同的命令没有暴发户(手动运行的exec部分),一切工作正常。
随着respawn节,主进程将会死亡并重新生成,而丢失的subprocess仍然存在,导致内存溢出。 没有它,stream程就会消失,直到没有工人离开。
芹菜产生了一个主进程和工作进程(在这种情况下,其中4个)。 我也尝试使用eventlet而不是多处理(1个主,1个subprocess)来运行它,但结果是相似的。
有没有人有过这种行为?
更新:
-c N运行时,以N + 2过程开始,其中N + 2是工人(另外两个是什么?)。 expect节有关,但不知道应该是什么值。 用eventlet expect fork是有道理的。 但是多处理呢? UPDATE2:
使用except fork似乎停止从死亡处理,但是当试图停止或重新开始工作,它只是挂起。
在script子句中使用chdir显然是错误的,这意味着你不能理解一个暴发户的非常基本的概念(没有冒犯的意思)。 (作为一个侧面说明, exec关键字只是没用,但没有伤害)。
有一个非常重要的理念来了解新贵如何运作。 Upstart尝试确定由script节产生的进程的哪个进程是该服务的实际守护进程。 然后,它使用这个过程来确定这个工作是否正在运行,停止或失败等等。 出于这个原因,确保正确处理stream程非常重要。
确定过程的algorithm非常简单,这取决于expect节。 expect fork意味着“在script节中取第二个分支”, expect daemon – 相同,但第三个。
现在,在script使用chdir意味着它调用实际的/bin/chdir二进制文件,并将其视为一个单独的分支。 你需要做的是把它移到script节以外,而不是玩expect节,直到你做对了。 你可以通过将initctl status celery的输出与ps进行比较来检查是否正确。 PID应该匹配。
解决办法是不要运行Celery和工作人员(从exec命令中删除-B部分)。
显然这是“额外”的过程,并以某种方式搞砸了事情。
这是我最后的脚本:
description "celery" start on started postgresql stop on runlevel [!2345] kill timeout 20 setuid *** setgid *** respawn chdir /opt/***/project/ exec /opt/***/virtualenvs/***/bin/python manage.py celery worker --settings=settings.staging -c 4 -l DEBUG
运行celery beat :
description "celerybeat" start on started celery stop on stopped celery setuid *** setgid *** respawn chdir /opt/***/project/ exec /opt/***/virtualenvs/***/bin/python manage.py celery beat --settings=settings.staging -l DEBUG