2011-11-03 33 views
15

tôi đang làm việc trên một chức năng nhỏ tiện lợi:Mở một quá trình với Popen và nhận được PID

def startProcess(name, path): 
    """ 
    Starts a process in the background and writes a PID file 

    returns integer: pid 
    """ 

    # Check if the process is already running 
    status, pid = processStatus(name) 

    if status == RUNNING: 
     raise AlreadyStartedError(pid) 

    # Start process 
    process = subprocess.Popen(path + ' > /dev/null 2> /dev/null &', shell=True) 

    # Write PID file 
    pidfilename = os.path.join(PIDPATH, name + '.pid') 
    pidfile = open(pidfilename, 'w') 
    pidfile.write(str(process.pid)) 
    pidfile.close() 

    return process.pid 

Vấn đề là process.pid không phải là PID chính xác. Có vẻ như nó luôn thấp hơn 1 lần so với PID chính xác. Ví dụ, nó nói quá trình bắt đầu tại 31729, nhưng ps nói rằng nó đang chạy ở 31730. Mỗi khi tôi đã cố gắng nó đi bằng 1. Tôi đoán PID nó trả về là PID của hiện tại quá trình, không phải là bắt đầu một, và quá trình mới nhận được pid 'tiếp theo' là 1 cao hơn. Nếu đúng như vậy, tôi không thể chỉ dựa vào việc trả lại process.pid + 1 vì tôi không đảm bảo rằng nó sẽ luôn chính xác.

Tại sao không process.pid trả về PID của quy trình mới và làm cách nào để tôi có thể đạt được hành vi sau?

+1

Thử xóa 'shell = True' và công cụ'> 'của bạn. – Blender

+0

tôi có cùng một vấn đề và tôi phát hiện ra một cách khó khăn, nó không phải lúc nào cũng PID + 1, lúc đầu, nhưng bây giờ nó cho tôi +2 – andrei

Trả lời

19

Từ tài liệu tại http://docs.python.org/library/subprocess.html:

Popen.pid The process ID of the child process.

Note that if you set the shell argument to True, this is the process ID of the spawned shell.

Nếu shell là sai, nó nên cư xử như bạn mong đợi, tôi nghĩ.

+0

Tôi cần 'shell = True' cho đường dẫn tương đối để python làm việc. Tôi đoán tôi sẽ thay thế nó bằng đường dẫn tuyệt đối và đặt 'shell' thành false. Cảm ơn vì thông tin! – Hubro

+1

Vượt qua con đường thông qua os.path.abspath trước tiên nên khắc phục điều đó cho bạn. http://docs.python.org/library/os.path.html –

+0

Không, chạy 'os.path.abspath ('python')' chỉ trả về thư mục làm việc của tôi cộng với 'python', ví dụ: '/ root/python' – Hubro

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