नाम से मार डालो प्रक्रिया?


100

मैं एक प्रक्रिया (विशेष रूप से iChat) को मारने की कोशिश कर रहा हूं। कमांड लाइन पर, मैं इन कमांड का उपयोग करता हूं:

ps -A | grep iChat 

फिर:

kill -9 PID

हालाँकि, मुझे यकीन नहीं है कि इन आदेशों का अनुवाद पायथन से कैसे किया जाए।

जवाबों:


86

मान लें कि आप यूनिक्स जैसे प्लेटफॉर्म पर हैं (ताकि वह 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, तो यह अलग-अलग यूनिक्स जैसी प्रणालियों में करना मुश्किल है ( psएक अर्थ में, प्रक्रिया सूची प्राप्त करने के लिए उनका सामान्य एपीआई है)। लेकिन अगर आपके पास एक विशिष्ट यूनिक्स जैसी प्रणाली है, तो केवल (किसी भी क्रॉस-प्लेटफॉर्म पोर्टेबिलिटी की आवश्यकता नहीं है), यह संभव हो सकता है; विशेष रूप से, लिनक्स पर, /procछद्म-फाइलसिस्टम बहुत मददगार है। इससे पहले कि हम इस उत्तरार्ध में मदद कर सकें, आपको अपनी सटीक आवश्यकताओं को स्पष्ट करना होगा।


1
यह बहुत अच्छी तरह से काम किया! मैं एक मैक वातावरण चला रहा हूँ तो मुझे लगता है कि यह सही होगा। आपकी मदद के लिए धन्यवाद।
एरोन

ऊपर .nix पर काम करता है, लेकिन पायथोनिक नहीं है। नीचे पोस्ट के रूप में स्वीकृत तरीका, os.system ('टास्ककिल / f / im exampleProcess.exe') दृष्टिकोण का उपयोग करना है, जो कोर पायथन का हिस्सा है।
जोन्सोम ने मोनिका

@Jonesome: आपका उत्तर विंडोज के लिए लगता है (कमांड सिंटैक्स और .exe फ़ाइल नाम के कारण), लेकिन सवाल मैक ओएस के लिए लगता है।
वासुदेव राम

मैं इस जवाब को पसंद करता हूं Giampaolo Rodolà's, क्योंकि भले ही यह बहुत पाइथोनिक नहीं है, यह विंडोज पर काम करता है यह मानते हुए कि आपने साइग्विन या Msys स्थापित किया है। Psutil विंडोज पर Python 2.7.10 में मौजूद नहीं है। मेरी मशीन पर "पिप इंस्टॉल इंप्यूट" करने का प्रयास विफल रहा, यह कहते हुए कि मुझे विजुअल C ++ 9.0 स्थापित करने की आवश्यकता है। कि पेंच! मैं बहुत बल्कि Cygwin या Msys स्थापित करूँगा।
एंड्रयू बैनब्रिज

पायथन 3.2 के बाद से विंडोज में काम करता है, लेकिन आमतौर पर सिग्नल मारे गए प्रक्रिया का निकास कोड होगा।
सेस टिम्मरमैन

206

psutil नाम से प्रक्रिया पा सकते हैं और इसे मार सकते हैं:

import psutil

PROCNAME = "python.exe"

for proc in psutil.process_iter():
    # check whether the process name matches
    if proc.name() == PROCNAME:
        proc.kill()

52
यह। क्योंकि यह क्रॉस प्लेटफॉर्म है
बेंगट जूल

2
या यदि आप कमांड लाइन के द्वारा कुछ करना चाहते हैं जैसे: if "your_python_script.py" in proc.cmdline: ..kill
OWADVL

11
इसका नकारात्मक पक्ष यह है कि इसे psutilपैकेज की आवश्यकता होती है , जो लक्ष्य मशीन पर मौजूद नहीं हो सकता है।
CadentOrange

1
@Bengt। यह क्रॉस प्लेटफॉर्म नहीं है यदि आप विंडोज को शामिल करते हैं! Psutil पायथन 2.7.10 का हिस्सा नहीं है। और जब तक आप Visual C ++ 9.0 स्थापित नहीं करते हैं, तब तक "pip install psutil" विफल रहता है, जो कई मामलों में अव्यावहारिक होगा। फिर भी, आपके 17 अपवित्रों पर बधाई :-) :-)
एंड्रयू बैनब्रिज

5
"पिप इंस्टॉल सस्टुटिल" ठीक काम करेगा क्योंकि यह पिपी पर व्हील संस्करण को पुनः प्राप्त करेगा। और नहीं, आपको एक कंपाइलर की आवश्यकता नहीं है।
गिआमपोलो रोडोला

36

यदि आपको क्रॉस-प्लेटफ़ॉर्म होने के लिए विंडोज केस पर विचार करना है, तो निम्नलिखित प्रयास करें:

os.system('taskkill /f /im exampleProcess.exe')

@ alansiqueira27 दुर्भाग्य से यह केवल विंडोज cmd केस है। आपको क्रॉस प्लेटफॉर्म समाधानों के लिए उपरोक्त उत्तर देखने होंगे।
सीमा सुरक्षा बल

यह मेरे उपयोग के मामले के लिए काम किया। Thanx! ध्यान दें, यह साफ-सुथरा है, यह उस नाम से सभी प्रक्रियाओं को मारता है, इसलिए यदि आपके पास एकाधिक Y.exe नहीं है, तो सभी प्रक्रिया आईडी की समाप्ति हो जाएगी।
बीजगणितीय ग्रैमीस्ट्रेटडेंट

23

यदि आपके पास हत्या है:

os.system("killall -9 iChat");

या:

os.system("ps -C iChat -o pid=|xargs kill -9")

9
वहाँ भी है pkill, हालांकि मुझे लगता है कि मैं दुनिया का एकमात्र व्यक्ति हूं जो इसके बजाय इसका उपयोग करता हैkillall
माइकल Mrozek

1
ठीक है, हाँ, ऐसा लगता है कि पहली कमांड सही काम की है। सहायता के लिए धन्यवाद।
एरोन

1
@MichaelMrozek आप टाइपिंग चीज़ों की मीठी भावना के साथ कैसे रह सकते हैं killall java?
एलोइस महदाल

@ मिचेल मैं उपयोग करता हूं pkillक्योंकि केवल killallमैं ही जानता था कि "सब कुछ मार डालो"।
काइल स्ट्रैंड

7

यह मेरे लिए विंडोज 7 में काम किया

import subprocess
subprocess.call("taskkill /IM geckodriver.exe")

3

आप यह कोशिश कर सकते हैं। लेकिन इससे पहले कि आप का उपयोग कर psutil स्थापित करने की आवश्यकता हैsudo pip install psutil

import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
    if 'ichat' in proc.info['name']:
        proc.kill()

कम से कम यह पोर्टेबल है, भले ही स्वीकृत जवाब पहले से ही इस समाधान का वर्णन करता है।
जीन फ़्राँस्वा Fabre

2

नीचे दिए गए कोड सभी 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)

1

आप उपयोग कर सकते हैं pkill <process_name> नाम से प्रक्रिया को मारने के लिए एक यूनिक्स प्रणाली में ।

फिर अजगर कोड होगा:

>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)

मेरे द्वारा उपयोग किए जा रहे सभी सिस्टम मैक हैं और जब मैं pkill चलाने की कोशिश करता हूं तो यह मुझे बता रहा है कि कमांड नहीं मिल सकता है।
एरोन

1

यदि आप किसी विशेष शीर्षक (ओं) को ले जाने की प्रक्रिया (तों) या 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 ) 

आशा करता हूँ की ये काम करेगा। उनके कई बेहतर समाधान मेरे लिए हो सकते हैं।


0

आप विंडोज़ पर ऐसा करने के लिए WMI मॉड्यूल का उपयोग कर सकते हैं, हालाँकि यह बहुत क्लंकियर है जितना आप यूनिक्स के लोगों के लिए उपयोग किया जाता है; import WMIएक लंबा समय लगता है और प्रक्रिया में आने के लिए मध्यवर्ती दर्द होता है।


0

मेरे लिए केवल एक चीज है जो काम करती है:

उदाहरण के लिए

import subprocess
proc = subprocess.Popen(["pkill", "-f", "scriptName.py"], stdout=subprocess.PIPE)
proc.wait()

0

9 सिगली सिग्नल का प्रतिनिधित्व करता है। तो आप KILL9 के स्थान पर उपयोग कर सकते हैं

os.system("kill -s KILL 1234")

0r

os.sytem("kill -KILL 1234")


0

एलेक्स मार्टेली जवाब पायथन 3 में काम नहीं करेगा क्योंकि outएक बाइट्स ऑब्जेक्ट होगा और इस प्रकार TypeError: a bytes-like object is required, not 'str'जब परीक्षण होगाif 'iChat' in line:

सबप्रोसेस प्रलेखन से उद्धरण :

संचार () एक टपल लौटाता है (stdout_data, stderr_data)। यदि पाठ मोड में स्ट्रीम खोले गए हैं तो डेटा तार होगा; अन्यथा, बाइट्स।

पायथन 3 के लिए, यह text=True(> = पायथन 3.7) या निर्माता से universal_newlines=Trueतर्क जोड़कर हल किया जाता है Popenoutफिर एक स्ट्रिंग ऑब्जेक्ट के रूप में लौटाया जाएगा।

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)

वैकल्पिक रूप से, आप बाइट्स के डिकोड () विधि का उपयोग करके एक स्ट्रिंग बना सकते हैं।

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)

-1
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()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.