Manage.py меняет свой PID? - PullRequest
       0

Manage.py меняет свой PID?

7 голосов
/ 11 марта 2012

Я пытаюсь создать процесс 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

Пид изменился! Что на земле происходит ???

1 Ответ

5 голосов
/ 11 марта 2012

Если вы видите другой 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 выполняется, и один (порожденный) с веб-сервером. Проверьте это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...