Cách tốt đẹp duy nhất tôi tìm thấy là:
import sys
import os
try:
os.kill[int[sys.argv[1]], 0]
print "Running"
except:
print "Not running"
[Nguồn] nhưng điều này có đáng tin cậy không? Nó có hoạt động với mọi quy trình và mọi phân phối không?
But is this reliable? Does it work with every process and every distribution?
JWW
93,8K87 Huy hiệu vàng388 Huy hiệu bạc846 Huy hiệu đồng87 gold badges388 silver badges846 bronze badges
Đã hỏi ngày 1 tháng 9 năm 2008 lúc 15:20Sep 1, 2008 at 15:20
Andreas Thomasandreas ThomasAndreas Thomas
4.2603 Huy hiệu vàng22 Huy hiệu bạc15 Huy hiệu Đồng3 gold badges22 silver badges15 bronze badges
1
Rốt cuộc, câu trả lời của Mark là cách để đi, đó là lý do tại sao hệ thống tệp /Proc ở đó. Đối với một cái gì đó sao chép hơn một chút/có thể làm được:
>>> import os.path
>>> os.path.exists["/proc/0"]
False
>>> os.path.exists["/proc/12"]
True
Đã trả lời ngày 1 tháng 9 năm 2008 lúc 18:06Sep 1, 2008 at 18:06
Aaron Maenpaaaaron MaenpaaAaron Maenpaa
Huy hiệu vàng 116K1194 Huy hiệu bạc108 Huy hiệu đồng11 gold badges94 silver badges108 bronze badges
1
Trên Linux, bạn có thể xem trong thư mục /Proc /$ PID để có được thông tin về quy trình đó. Trong thực tế, nếu thư mục tồn tại, quá trình đang chạy.
Đã trả lời ngày 1 tháng 9 năm 2008 lúc 15:50Sep 1, 2008 at 15:50
Mark Harrisonmark HarrisonMark Harrison
290K121 Huy hiệu vàng325 Huy hiệu bạc457 Huy hiệu đồng121 gold badges325 silver badges457 bronze badges
Nó sẽ hoạt động trên bất kỳ hệ thống POSIX nào [mặc dù nhìn vào hệ thống tập tin /proc
, như những người khác đã đề xuất, sẽ dễ dàng hơn nếu bạn biết nó sẽ ở đó].
Tuy nhiên: os.kill
cũng có thể thất bại nếu bạn không có quyền báo hiệu quá trình. Bạn sẽ cần phải làm một cái gì đó như:
import sys
import os
import errno
try:
os.kill[int[sys.argv[1]], 0]
except OSError, err:
if err.errno == errno.ESRCH:
print "Not running"
elif err.errno == errno.EPERM:
print "No permission to signal this process!"
else:
print "Unknown error"
else:
print "Running"
Đã trả lời ngày 1 tháng 9 năm 2008 lúc 17:40Sep 1, 2008 at 17:40
Đây là giải pháp giải quyết nó cho tôi:
import os
import subprocess
import re
def findThisProcess[ process_name ]:
ps = subprocess.Popen["ps -eaf | grep "+process_name, shell=True, stdout=subprocess.PIPE]
output = ps.stdout.read[]
ps.stdout.close[]
ps.wait[]
return output
# This is the function you can use
def isThisRunning[ process_name ]:
output = findThisProcess[ process_name ]
if re.search['path/of/process'+process_name, output] is None:
return False
else:
return True
# Example of how to use
if isThisRunning['some_process'] == False:
print["Not running"]
else:
print["Running!"]
Tôi là một Python + Linux Newbie, vì vậy điều này có thể không tối ưu. Nó đã giải quyết vấn đề của tôi, và hy vọng cũng sẽ giúp đỡ người khác.
Đã trả lời ngày 9 tháng 11 năm 2010 lúc 21:49Nov 9, 2010 at 21:49
Sivabudhsivabudhsivabudh
31.1K60 Huy hiệu vàng159 Huy hiệu bạc226 Huy hiệu Đồng60 gold badges159 silver badges226 bronze badges
2
Tôi sử dụng điều này để có được các quy trình và số lượng của quy trình của tên được chỉ định
import os
processname = 'somprocessname'
tmp = os.popen["ps -Af"].read[]
proccount = tmp.count[processname]
if proccount > 0:
print[proccount, ' processes running of ', processname, 'type']
Đã trả lời ngày 15 tháng 8 năm 2013 lúc 18:54Aug 15, 2013 at 18:54
Felbusfelbusfelbus
2.5992 Huy hiệu vàng23 Huy hiệu bạc29 Huy hiệu đồng2 gold badges23 silver badges29 bronze badges
1
Nhưng điều này có đáng tin cậy không? Nó có hoạt động với mọi quy trình và mọi phân phối không?
Có, nó nên hoạt động trên bất kỳ phân phối Linux. Xin lưu ý rằng /Proc không dễ dàng có sẵn trên các hệ thống dựa trên Unix, mặc dù [FreeBSD, OSX].
JWW
93,8K87 Huy hiệu vàng388 Huy hiệu bạc846 Huy hiệu đồng87 gold badges388 silver badges846 bronze badges
Đã hỏi ngày 1 tháng 9 năm 2008 lúc 15:20Sep 5, 2008 at 11:02
Andreas Thomasandreas ThomasMarius
4.2603 Huy hiệu vàng22 Huy hiệu bạc15 Huy hiệu Đồng3 gold badges27 silver badges30 bronze badges
Rốt cuộc, câu trả lời của Mark là cách để đi, đó là lý do tại sao hệ thống tệp /Proc ở đó. Đối với một cái gì đó sao chép hơn một chút/có thể làm được:
Đã trả lời ngày 1 tháng 9 năm 2008 lúc 18:06Feb 24, 2011 at 23:51
Aaron Maenpaaaaron Maenpaatimblaktu
Huy hiệu vàng 116K1194 Huy hiệu bạc108 Huy hiệu đồng3 silver badges11 bronze badges
1
Trên Linux, bạn có thể xem trong thư mục /Proc /$ PID để có được thông tin về quy trình đó. Trong thực tế, nếu thư mục tồn tại, quá trình đang chạy.
#proc -> name/id of the process
#id = 1 -> search for pid
#id = 0 -> search for name [default]
def process_exists[proc, id = 0]:
ps = subprocess.Popen["ps -A", shell=True, stdout=subprocess.PIPE]
ps_pid = ps.pid
output = ps.stdout.read[]
ps.stdout.close[]
ps.wait[]
for line in output.split["\n"]:
if line != "" and line != None:
fields = line.split[]
pid = fields[0]
pname = fields[3]
if[id == 0]:
if[pname == proc]:
return True
else:
if[pid == proc]:
return True
return False
Đã trả lời ngày 1 tháng 9 năm 2008 lúc 15:50
Mark Harrisonmark HarrisonAug 2, 2012 at 20:05
290K121 Huy hiệu vàng325 Huy hiệu bạc457 Huy hiệu đồng
def process_exists[proc_name]:
ps = subprocess.Popen["ps ax -o pid= -o args= ", shell=True, stdout=subprocess.PIPE]
ps_pid = ps.pid
output = ps.stdout.read[]
ps.stdout.close[]
ps.wait[]
for line in output.split["\n"]:
res = re.findall["[\d+] [.*]", line]
if res:
pid = int[res[0][0]]
if proc_name in res[0][1] and pid != os.getpid[] and pid != ps_pid:
return True
return False
Nó sẽ hoạt động trên bất kỳ hệ thống POSIX nào [mặc dù nhìn vào hệ thống tập tin /proc
, như những người khác đã đề xuất, sẽ dễ dàng hơn nếu bạn biết nó sẽ ở đó].Aug 10, 2011 at 9:31
Tuy nhiên: os.kill
cũng có thể thất bại nếu bạn không có quyền báo hiệu quá trình. Bạn sẽ cần phải làm một cái gì đó như:Maksym Kozlenko
Đã trả lời ngày 1 tháng 9 năm 2008 lúc 17:402 gold badges65 silver badges54 bronze badges