2011-10-04 47 views
32

Tôi đang cố gắng tìm xem liệu quy trình có đang chạy dựa trên id quá trình hay không. Mã như sau dựa trên một trong các bài đăng trên diễn đàn. Tôi không thể xem xét tên quy trình vì có nhiều quá trình đang chạy với cùng tên.Kiểm tra xem quy trình có đang chạy bằng Python (trong Linux/Unix)

def findProcess(processId): 
    ps= subprocess.Popen("ps -ef | grep "+processId, shell=True, stdout=subprocess.PIPE) 
    output = ps.stdout.read() 
    ps.stdout.close() 
    ps.wait() 
    return output 
def isProcessRunning(processId): 
    output = findProcess(processId) 
    if re.search(processId, output) is None: 
     return true 
    else: 
     return False 

Output:

1111 72312 72311 0 0:00.00 ttys000 0:00.00 /bin/sh -c ps -ef | grep 71676 
1111 72314 72312 0 0:00.00 ttys000 0:00.00 grep 71676 

Nó luôn luôn trở thành sự thật vì nó có thể tìm id quá trình trong chuỗi đầu ra.

Mọi đề xuất? Cảm ơn vì bất kì sự giúp đỡ.

+0

@Cody: Tôi không nhìn đủ xa để nhìn thấy điều đó! –

Trả lời

39

Hãy thử:

os.kill(pid, 0) 

nên thành công (và không làm gì cả) nếu quá trình tồn tại, hoặc ném một ngoại lệ (mà bạn có thể bắt) nếu quá trình này không tồn tại.

+0

trên hệ thống posix đó là cách tốt nhất để làm điều đó. –

+4

Nó sẽ giết quá trình? – sharafjaffri

+6

Không, nó sẽ không thực sự giết chết quá trình. 'kill' là một cuộc gọi hệ thống có tên xấu. – user9876

3

Nếu quá trình đó thuộc về cùng một người dùng quy trình kiểm tra, bạn chỉ có thể thử kill. Nếu bạn sử dụng tín hiệu 0, giết sẽ không gửi bất cứ điều gì nhưng vẫn cho phép bạn biết liệu quá trình có sẵn hay không.

Từ kill(2):

If sig is 0, then no signal is sent, but error checking is still performed; this can be used to check for the existence of a process ID or process group ID.

này nên tuyên truyền phù hợp với các phương pháp python.

+0

Tôi sẽ không đảm bảo hành vi này trên Windows, mặc dù nó sẽ ổn trên Linux. –

+0

Xét OP bắt đầu bằng 'ps | grep', tôi không nghĩ rằng đó là một vấn đề;) – viraptor

5

Nếu bạn không nhớ sử dụng mô-đun bên ngoài, tôi khuyên bạn nên psutil. Nó là đa nền tảng và dễ sử dụng hơn so với vỏ bọc sinh sản chỉ với mục đích tìm kiếm một tiến trình đang chạy.

9

Đây là một chút kludge, nhưng trên * nix bạn có thể sử dụng os.getpgid(pid) hoặc os.kill(pid, sig) để kiểm tra sự tồn tại của ID tiến trình.

import os 

def is_process_running(process_id): 
    try: 
     os.kill(process_id, 0) 
     return True 
    except OSError: 
     return False 

EDIT: Lưu ý rằng os.kill công trình trên Windows (như của Python 2.7), trong khi os.getpgidsẽ không. Nhưng phiên bản Windows gọi TerminateProcess(), sẽ "vô điều kiện gây ra quá trình thoát", vì vậy tôi dự đoán rằng nó sẽ không trả lại thông tin bạn muốn mà không thực sự giết chết quá trình nếu nó tồn tại.

Nếu bạn đang sử dụng Windows, vui lòng cho chúng tôi biết vì không có giải pháp nào trong số này có thể chấp nhận được trong trường hợp đó.

+0

Điều này hoạt động hoàn toàn tốt đẹp. Cảm ơn vì tất cả những hồi đáp. – shash

+0

'os.kill (, 0)' kết quả trong 'lỗi 87 tham số là không chính xác' như của python 2.7.6 trên Windows –

11

Câu trả lời đơn giản nhất theo ý kiến ​​của tôi (albiet có thể không lý tưởng), sẽ được thay đổi của bạn

ps -ef | grep <pid> 

Để:

ps -ef | grep <pid> | grep -v grep 

này sẽ bỏ qua việc niêm yết quy trình cho việc tìm kiếm grep chứa PID của quá trình bạn đang cố tìm.

Có vẻ như câu trả lời của người dùng9876 còn xa hơn "pythonic".

+0

thats thường làm thế nào tôi làm điều đó. – vinodkone

+0

Đó không phải là không thấm nước. Tốt hơn để làm (trên Linux) os.path.lexists ('/ proc /% s'% pid) – Willem

+0

Câu trả lời này (cùng với việc thực hiện của người hỏi) là không chính xác. Đó là một ý tưởng khủng khiếp để phân tích đầu ra từ 'ps', đặc biệt là cho một cái gì đó như thế này. Như một thử nghiệm đơn giản, tôi đã grepped một PID của 161 và nó cũng trả về một quá trình với PID 1613. Nếu bạn cần sử dụng 'grep' thì bạn muốn sử dụng một biểu thức chính quy để ngăn chặn các mặt tích cực sai. Dù sao, điều này là không liên quan cho hầu hết các phần như là câu trả lời đúng (nếu bạn được giải quyết để sử dụng Linux shell) nên được 'ps PID'. – Six

-2

Bạn phải tìm nó hai lần ..

Như thế này:

ps -ef | grep 71676 | sed 's/71676//' | grep 71676

Nếu đây trả True thì đây thực sự là chạy !!

+0

Giả sử PID là duy nhất trong danh sách đó là một ý tưởng tồi.Cụ thể hơn, PID là duy nhất, nhưng nó có thể tồn tại trong các cột khác. Ví dụ, 127 tồn tại trong PID "127", "1127" và địa chỉ IP loopback cục bộ. Thay vào đó, hãy chạy "ps -eo pid | egrep^71676 $". – Olli

+0

điều này, theo định nghĩa, sẽ không bao giờ tìm thấy bất cứ điều gì .... –

2

Trên Windows tùy chọn khác là sử dụng tasklist.exe:

Cú pháp: tasklist.exe/NH/FI "PID eq processID"

def IsProcessRunning(processId): 
    ps= subprocess.Popen(r'tasklist.exe /NH /FI "PID eq %d"' % (processId), shell=True, stdout=subprocess.PIPE) 
    output = ps.stdout.read() 
    ps.stdout.close() 
    ps.wait() 
    if processId in output: 
     return True 
    return False 
2

Trên Windows, bạn có thể sử dụng WMI.

from win32com.client import GetObject 
GetObject('winmgmts:').ExecQuery("Select * from Win32_Process where ProcessId = " + str(pid)).count 

Bạn cũng có thể sử dụng các bộ lọc khác. Ví dụ: tôi có nhiều khả năng chỉ muốn biết liệu một quy trình có đang chạy theo tên và thực hiện hành động hay không. Ví dụ, nếu DbgView không chạy, hãy khởi động nó.

if not GetObject('winmgmts:').ExecQuery("Select * from Win32_Process where Name = 'dbgview.exe'").count: 
    subprocess.Popen(r"C:\U\dbgview.exe", shell=False) 

Bạn cũng có thể lặp lại và làm những điều thú vị khác. Danh sách đầy đủ các trường là here.

3

Tôi biết điều này là cũ, nhưng tôi đã sử dụng điều này và có vẻ như nó hoạt động; bạn có thể làm một sự thích nghi nhanh chóng để chuyển đổi từ tên quá trình xử lý id:

try: 
    if len(os.popen("ps -aef | grep -i 'myprocess' | grep -v 'grep' | awk '{ print $3 }'").read().strip().split('\n')) > 1: 
     raise SystemExit(0) 
except Exception, e: 
     raise e 
0

Gần đây tôi đã phải liệt kê các tiến trình đang chạy và đã làm như vậy:

def check_process(process): 
    import re 
    import subprocess 

    returnprocess = False 
    s = subprocess.Popen(["ps", "ax"],stdout=subprocess.PIPE) 
    for x in s.stdout: 
     if re.search(process, x): 
      returnprocess = True 

    if returnprocess == False:   
     print 'no process executing' 
    if returnprocess == True: 
     print 'process executing' 
Các vấn đề liên quan