manage.py会改变它的PID吗?

San*_*dro 7 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) 
Run Code Online (Sandbox Code Playgroud)

这给了我以下输出:

START PID: 13019
PARENT PID: 13019
CHILD PID: 13020
IN THE CHILD PID: 13020
Run Code Online (Sandbox Code Playgroud)

但现在当我检查实时流程时:

> 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
Run Code Online (Sandbox Code Playgroud)

pid改变了!到底是怎么回事?

Kir*_*ill 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)
Run Code Online (Sandbox Code Playgroud)

因此,使用您的脚本,您将获得两个进程:一个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
Run Code Online (Sandbox Code Playgroud)