manage.py会改变它的PID吗?

时间:2012-03-11 04:26:36

标签: python django exec

我正在尝试生成一个在调用脚本死后继续存在的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改变了!到底是怎么回事?

1 个答案:

答案 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