ฉันพยายามฆ่ากระบวนการ (โดยเฉพาะ iChat) ในบรรทัดคำสั่งฉันใช้คำสั่งเหล่านี้:
ps -A | grep iChat
จากนั้น:
kill -9 PID
อย่างไรก็ตามฉันไม่แน่ใจว่าจะแปลคำสั่งเหล่านี้เป็น Python อย่างไร
ฉันพยายามฆ่ากระบวนการ (โดยเฉพาะ iChat) ในบรรทัดคำสั่งฉันใช้คำสั่งเหล่านี้:
ps -A | grep iChat
จากนั้น:
kill -9 PID
อย่างไรก็ตามฉันไม่แน่ใจว่าจะแปลคำสั่งเหล่านี้เป็น Python อย่างไร
คำตอบ:
สมมติว่าคุณอยู่บนแพลตฟอร์มที่เหมือน Unix ( ps -A
มีอยู่แล้ว)
>>> import subprocess, signal
>>> import os
>>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
>>> out, err = p.communicate()
ให้ps -A
ผลลัพธ์ของคุณในout
ตัวแปร (สตริง) คุณสามารถแบ่งมันออกเป็นเส้นและวนซ้ำได้ ... :
>>> for line in out.splitlines():
... if 'iChat' in line:
... pid = int(line.split(None, 1)[0])
... os.kill(pid, signal.SIGKILL)
...
(คุณสามารถหลีกเลี่ยงการนำเข้าsignal
และใช้9
แทนได้signal.SIGKILL
แต่ฉันไม่ชอบสไตล์นั้นเป็นพิเศษดังนั้นฉันจึงควรใช้ค่าคงที่ที่ตั้งชื่อด้วยวิธีนี้)
แน่นอนว่าคุณสามารถประมวลผลที่ซับซ้อนกว่านี้ได้มากในบรรทัดเหล่านี้ แต่มันจะเลียนแบบสิ่งที่คุณกำลังทำอยู่ในเชลล์
หากสิ่งที่คุณต้องการหลีกเลี่ยงps
นั่นเป็นเรื่องยากที่จะทำในระบบที่คล้าย Unix อื่น ๆ ( ps
เป็น API ทั่วไปในการรับรายการกระบวนการหรือไม่) แต่ถ้าคุณมีระบบที่คล้าย Unix เฉพาะในใจเท่านั้น (ไม่ต้องการการพกพาข้ามแพลตฟอร์มใด ๆ ) อาจเป็นไปได้ โดยเฉพาะบน Linux /proc
ระบบไฟล์หลอกจะมีประโยชน์มาก แต่คุณจะต้องชี้แจงข้อกำหนดที่แน่นอนของคุณก่อนที่เราจะสามารถช่วยได้ในส่วนหลังนี้
psutilสามารถค้นหากระบวนการตามชื่อและฆ่ามัน:
import psutil
PROCNAME = "python.exe"
for proc in psutil.process_iter():
# check whether the process name matches
if proc.name() == PROCNAME:
proc.kill()
psutil
แพคเกจซึ่งอาจไม่มีอยู่ในเครื่องเป้าหมาย
หากคุณต้องพิจารณากรณีของ Windows เพื่อที่จะข้ามแพลตฟอร์มให้ลองทำดังต่อไปนี้:
os.system('taskkill /f /im exampleProcess.exe')
หากคุณมี killall:
os.system("killall -9 iChat");
หรือ:
os.system("ps -C iChat -o pid=|xargs kill -9")
pkill
แม้ว่าฉันคิดว่าฉันเป็นคนเดียวในโลกที่ใช้มันแทนkillall
killall java
อย่างไร?
pkill
เพราะสิ่งเดียวที่killall
ฉันรู้คือ "ฆ่าทุกอย่าง"
สิ่งนี้ใช้ได้กับฉันใน windows 7
import subprocess
subprocess.call("taskkill /IM geckodriver.exe")
คุณสามารถลองสิ่งนี้ แต่ก่อนที่คุณจะต้องติดตั้งpsutilโดยใช้ไฟล์sudo pip install psutil
import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
if 'ichat' in proc.info['name']:
proc.kill()
รหัสด้านล่างจะฆ่าโปรแกรมที่มุ่งเน้น iChat ทั้งหมด:
p = subprocess.Popen(['pgrep', '-l' , 'iChat'], stdout=subprocess.PIPE)
out, err = p.communicate()
for line in out.splitlines():
line = bytes.decode(line)
pid = int(line.split(None, 1)[0])
os.kill(pid, signal.SIGKILL)
รับวัตถุกระบวนการโดยใช้Process
.
>>> import psutil
>>> p = psutil.Process(23442)
>>> p
psutil.Process(pid=23442, name='python3.6', started='09:24:16')
>>> p.kill()
>>>
คุณสามารถใช้pkill <process_name>
ในระบบยูนิกซ์เพื่อฆ่ากระบวนการตามชื่อ
จากนั้นรหัส python จะเป็น:
>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)
คุณสามารถใช้โมดูล WMI เพื่อทำสิ่งนี้บน windows ได้แม้ว่ามันจะเยอะกว่าที่คุณเคยใช้ import WMI
ใช้เวลานานและมีความเจ็บปวดระดับกลางในการดำเนินการ
หากคุณต้องการฆ่ากระบวนการหรือ cmd.exe ที่มีชื่อเฉพาะ
import csv, os
import subprocess
# ## Find the command prompt windows.
# ## Collect the details of the command prompt windows and assign them.
tasks = csv.DictReader(subprocess.check_output('tasklist /fi "imagename eq cmd.exe" /v /fo csv').splitlines(), delimiter=',', quotechar='"')
# ## The cmds with titles to be closed.
titles= ["Ploter", "scanFolder"]
# ## Find the PIDs of the cmds with the above titles.
PIDList = []
for line in tasks:
for title in titles:
if title in line['Window Title']:
print line['Window Title']
PIDList.append(line['PID'])
# ## Kill the CMDs carrying the PIDs in PIDList
for id in PIDList:
os.system('taskkill /pid ' + id )
หวังว่าจะช่วยได้ พวกเขาอาจมีทางออกที่ดีกว่ามากมายสำหรับฉัน
คำตอบของ Alex Martelli ใช้ไม่ได้ใน Python 3 เนื่องจากout
จะเป็นวัตถุไบต์และส่งผลให้TypeError: a bytes-like object is required, not 'str'
เมื่อทำการทดสอบif 'iChat' in line:
การทดสอบเมื่อ
อ้างจากเอกสารกระบวนการย่อย:
สื่อสาร () ส่งคืนทูเพิล (stdout_data, stderr_data) ข้อมูลจะเป็นสตริงหากสตรีมถูกเปิดในโหมดข้อความ มิฉะนั้นไบต์
สำหรับ Python 3 สิ่งนี้แก้ไขได้โดยการเพิ่มtext=True
(> = Python 3.7) หรือuniversal_newlines=True
อาร์กิวเมนต์ให้กับตัวPopen
สร้าง out
จากนั้นจะถูกส่งกลับเป็นวัตถุสตริง
import subprocess, signal
import os
p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE, text=True)
out, err = p.communicate()
for line in out.splitlines():
if 'iChat' in line:
pid = int(line.split(None, 1)[0])
os.kill(pid, signal.SIGKILL)
หรือคุณสามารถสร้างสตริงโดยใช้เมธอด decode () ของไบต์
import subprocess, signal
import os
p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
out, err = p.communicate()
for line in out.splitlines():
if 'iChat' in line.decode('utf-8'):
pid = int(line.split(None, 1)[0])
os.kill(pid, signal.SIGKILL)
สำหรับฉันสิ่งเดียวที่ได้ผลคือ:
ตัวอย่างเช่น
import subprocess
proc = subprocess.Popen(["pkill", "-f", "scriptName.py"], stdout=subprocess.PIPE)
proc.wait()
import os, signal
def check_kill_process(pstring):
for line in os.popen("ps ax | grep " + pstring + " | grep -v grep"):
fields = line.split()
pid = fields[0]
os.kill(int(pid), signal.SIGKILL)
import psutil
pid_list=psutil.get_pid_list()
print pid_list
p = psutil.Process(1052)
print p.name
for i in pid_list:
p = psutil.Process(i)
p_name=p.name
print str(i)+" "+str(p.name)
if p_name=="PerfExp.exe":
print "*"*20+" mam ho "+"*"*20
p.kill()