2012-03-11 17 views
8

Tôi đang cố gắng để sinh ra một quá trình django mà sống sau khi kịch bản gọi điện thoại đã chết. Nhưng tôi cần nó là PID.Liệu manage.py có thay đổi PID của nó không?

Vì vậy, tôi đã viết đoạn mã sau:

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) 

này mang lại cho tôi kết quả như sau:

START PID: 13019 
PARENT PID: 13019 
CHILD PID: 13020 
IN THE CHILD PID: 13020 

Nhưng bây giờ khi tôi kiểm tra các quá trình sống:

> 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 

Các pid đã thay đổi! Chuyện quái quỷ gì đang xảy ra???

+0

Tôi * biết * Tôi sẽ hối tiếc khi yêu cầu điều này, nhưng * tại sao * bạn có bắt đầu máy chủ lưu trữ từ tập lệnh của mình không? –

+0

Chủ yếu là một thử nghiệm cho bản thân mình. Chỉ cần đặt cùng một kịch bản hacky nhanh chóng theo dõi tất cả các quy trình cho trang web django thú cưng của tôi. Không phải lo lắng, không phải là một phần của sản phẩm hay bất cứ thứ gì;) Khi tôi phát minh ra bánh xe, có một công cụ đã làm những thứ như thế này mà bạn có thể gợi ý không? – Sandro

+0

Không thực sự bất cứ điều gì tôi có thể đề nghị, kể từ khi tôi luôn luôn chạy Django dưới mod_wsgi. Và có rất nhiều công cụ quản lý httpd trên mạng. –

Trả lời

5

Nếu bạn thấy PID khác thì chắc chắn có một quy trình mới. Bạn có thể dễ dàng tìm thấy nơi mà quy trình mới sinh ra. Bắt đầu từ django.core.management.commands.runserver và bạn sẽ đến django.utils.autoreload.python_reloader. Khi python_reloader gọi là lần đầu tiên trong một quá trình nó đi để restart_with_reloader nơi bạn có thể thấy điều này:

exit_code = os.spawnve(os.P_WAIT, sys.executable, args, new_environ) 

Qua đó, với kịch bản của bạn, bạn có được hai quá trình: một nơi runserver được thực hiện và một (sinh ra) với máy chủ web. Kiểm tra xem:

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 
+1

@Sandro: Nếu bạn đã thông qua tên của quá trình trong cuộc gọi execvp ngay từ đầu, bạn sẽ ngay lập tức nhận ra rằng luôn có hai quy trình. 'os.execvp (" python ", [" python "," manage.py "," máy chủ chạy "," 0.0.0.0:2869 "])'. Nó luôn luôn là một thực hành tốt để làm điều này – Phani

+0

@Kirill Bạn đóng đinh nó. Tôi không có ý tưởng tại sao tôi không chỉ grep mã cơ sở cho đẻ trứng! Cảm ơn bạn! – Sandro

+0

@Phani Tôi không chắc chắn tôi theo dõi. Thêm đối số đầu tiên làm gì? – Sandro

Các vấn đề liên quan