2009-06-17 22 views

Trả lời

0

os.waitpid() có thể được giúp đỡ:

try: 
    os.waitpid(pid, 0) 
except OSError: 
    running = False 
else: 
    running = True 
+0

waitpid chờ đợi cho đến khi thoát trình. Do đó, kết quả luôn là Sai. Ngoài ra, waitpid chỉ có thể được gọi trên các tiến trình con. – phihag

0

Một cách để làm điều này để có được thông tin sẽ là:

import commands 
output = commands.getstatusoutput("ps -ef | awk '{print $2}' | grep MYPID") 

Xem: http://docs.python.org/library/commands.html

Tôi nghĩ:

commands.getoutput(...) 

có thể được sử dụng để nhận siêu dữ liệu có sẵn trên dòng 'ps'. Vì bạn đang sử dụng hệ thống POSIX, tôi tưởng tượng ps (hoặc tương đương) sẽ có sẵn (ví dụ: prstat dưới Solaris).

+0

Tốt hơn để sử dụng mô-đun "subprocess" (xem http://docs.python.org/library/subprocess.html#replacing-older-functions-with-the-subprocess-module) –

+0

Đồng ý - bằng cách sử dụng nhiều hơn lên đến -date module sẽ thích hợp hơn. –

4

Trên Linux ít nhất thư mục/proc có những gì bạn đang tìm kiếm. Về cơ bản, dữ liệu hệ thống từ hạt nhân được biểu diễn dưới dạng thư mục và tệp. Tất cả các thư mục số đều là các chi tiết của các tiến trình. Chỉ cần sử dụng các hàm os python cơ bản để lấy dữ liệu này:

#ls /proc 
1  17 18675 25346 26390 28071 28674 28848 28871 29347 590 851 874 906 9621 9655  devices  iomem  modules ... 

#ls /proc/1 
auxv cmdline cwd environ exe fd maps mem mounts root stat statm status task wchan 

#cat /proc/1/cmdline 
init [3] 
1

Nhìn vào /proc/pid. Điều này chỉ tồn tại trong tiến trình đang chạy và chứa rất nhiều thông tin.

+0

Và chỉ trên Linux. – zgoda

+0

@zgoda Không chỉ trên Linux, mặc dù nó không có trong POSIX. afaik,/proc có sẵn trên Linux, Solaris, BSD (ngoại trừ Max OS X), AIX và Cygwin – phihag

11

Thay vì os.waitpid, bạn cũng có thể sử dụng os.kill với tín hiệu 0:

>>> os.kill(8861, 0) 
>>> os.kill(12765, 0) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
OSError: [Errno 3] No such process 
>>> 

Edit: cởi mở hơn:

import errno 
import os 

def pid_exists(pid): 
    try: 
     os.kill(pid, 0) 
    except OSError, e: 
     return e.errno == errno.EPERM 
    else: 
     return True 

này hoạt động tốt trên Linux box của tôi. Tôi đã không xác minh rằng "tín hiệu 0" thực sự là Posix, nhưng nó luôn hoạt động trên mọi biến thể Unix mà tôi đã thử.

+0

Cách tiếp cận này hoàn toàn thiếu sót: Trong hầu hết các trường hợp, nó chỉ liệt kê các tiến trình do người dùng của bạn bắt đầu. Khi một mô-đun ủy quyền phi truyền thống đi vào hoạt động, nó sẽ không hoạt động chút nào. – phihag

+2

Tôi không nghĩ nó hoàn toàn thiếu sót. Nó cho bạn biết liệu một quá trình có tồn tại hay không, đó là những gì được yêu cầu. (errno cho phép bạn phân biệt giữa "không tồn tại" và "bạn không được phép".) Mô-đun phi truyền thống có thể phá vỡ bất cứ điều gì, tất nhiên. –

+0

@ liw.fi Chỉ khi quy trình đã được bạn bắt đầu ngay từ đầu. Ít nhất là trên hệ thống của tôi, tôi nhận được lỗi 10 tất cả các thời gian – phihag

2

Trong một cách cầm tay, bằng cách sử dụng psutil (https://github.com/giampaolo/psutil)

>>> import psutil, os 
>>> psutil.pid_exists(342342) 
False 
>>> psutil.pid_exists(os.getpid()) 
True 
>>> 
Các vấn đề liên quan