我正在尝试生成一个在调用脚本死后继续存在的django进程。但我需要它的PID。
所以我写了下面的代码:
def runserver():
print("START PID: " + str(os.getpid()))
pid = os.fork()
if pid == 0:
#cmd = "/usr/bin/env python manage.py runserver 0.0.0.0:2869"
print("IN THE CHILD PID: " + str(os.getpid()))
os.execvp("python", ["", "manage.py", "runserver", "0.0.0.0:2869"])
else:
print("PARENT PID: " + str(os.getpid()))
print("CHILD PID: " + str(pid))
updatepid("runserver", pid)
这给了我以下输出:
START PID: 13019
PARENT PID: 13019
CHILD PID: 13020
IN THE CHILD PID: 13020
但现在当我查看实时流程时:
> ps aux | grep python | grep -v grep
sandro 13031 0.4 0.3 296080 23756 pts/2 Sl 22:14 0:01 /home/sandro/.virtualenvs/polling/bin/python2.7 manage.py runserver 0.0.0.0:2869
pid改变了!到底是怎么回事?
答案 0 :(得分:5)
如果你看到另一个PID那么肯定有一个新的过程。您可以轻松找到新进程生成的位置。从django.core.management.commands.runserver
开始,您将进入django.utils.autoreload.python_reloader
。在python_reloader
第一次调用流程时,会转到restart_with_reloader
,您可以在此处看到:
exit_code = os.spawnve(os.P_WAIT, sys.executable, args, new_environ)
因此,使用您的脚本,您将获得两个进程:一个执行runserver
,另一个(生成)使用Web服务器。检查一下:
START PID: 3091
PARENT PID: 3091
CHILD PID: 3092
IN THE CHILD PID: 3092
$ ps ax | grep runserver | grep -v grep
3092 pts/1 S 0:00 runserver 0.0.0.0:2869
3093 pts/1 Sl 0:05 /home/kirill/testenv/bin/python manage.py runserver 0.0.0.0:2869