Kill process by name?
PythonProcessKillPython Problem Overview
I'm trying to kill a process (specifically iChat). On the command line, I use these commands:
ps -A | grep iChat
Then:
kill -9 PID
However, I'm not exactly sure how to translate these commands over to Python.
Python Solutions
Solution 1 - Python
psutil can find process by name and kill it:
import psutil
PROCNAME = "python.exe"
for proc in psutil.process_iter():
# check whether the process name matches
if proc.name() == PROCNAME:
proc.kill()
Solution 2 - Python
Assuming you're on a Unix-like platform (so that ps -A
exists),
>>> import subprocess, signal
>>> import os
>>> p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
>>> out, err = p.communicate()
gives you ps -A
's output in the out
variable (a string). You can break it down into lines and loop on them...:
>>> for line in out.splitlines():
... if 'iChat' in line:
... pid = int(line.split(None, 1)[0])
... os.kill(pid, signal.SIGKILL)
...
(you could avoid importing signal
, and use 9
instead of signal.SIGKILL
, but I just don't particularly like that style, so I'd rather used the named constant this way).
Of course you could do much more sophisticated processing on these lines, but this mimics what you're doing in shell.
If what you're after is avoiding ps
, that's hard to do across different Unix-like systems (ps
is their common API to get a process list, in a sense). But if you have a specific Unix-like system in mind, only (not requiring any cross-platform portability), it may be possible; in particular, on Linux, the /proc
pseudo-filesystem is very helpful. But you'll need to clarify your exact requirements before we can help on this latter part.
Solution 3 - Python
If you have to consider the Windows case in order to be cross-platform, then try the following:
os.system('taskkill /f /im exampleProcess.exe')
Solution 4 - Python
If you have killall:
os.system("killall -9 iChat");
Or:
os.system("ps -C iChat -o pid=|xargs kill -9")
Solution 5 - Python
You can try this.
but before you need to install psutil using sudo pip install psutil
import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
if 'ichat' in proc.info['name']:
proc.kill()
Solution 6 - Python
this worked for me in windows 7
import subprocess
subprocess.call("taskkill /IM geckodriver.exe")
Solution 7 - Python
The below code will kill all iChat oriented programs:
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)
Solution 8 - Python
Get the process object using the Process
.
>>> import psutil
>>> p = psutil.Process(23442)
>>> p
psutil.Process(pid=23442, name='python3.6', started='09:24:16')
>>> p.kill()
>>>
Solution 9 - Python
You can use the psutil
module to kill a process using it's name. For the most part, this should be cross platform.
import traceback
import psutil
def kill(process_name):
"""Kill Running Process by using it's name
- Generate list of processes currently running
- Iterate through each process
- Check if process name or cmdline matches the input process_name
- Kill if match is found
Parameters
----------
process_name: str
Name of the process to kill (ex: HD-Player.exe)
Returns
-------
None
"""
try:
print(f'Killing processes {process_name}')
processes = psutil.process_iter()
for process in processes:
try:
print(f'Process: {process}')
print(f'id: {process.pid}')
print(f'name: {process.name()}')
print(f'cmdline: {process.cmdline()}')
if process_name == process.name() or process_name in process.cmdline():
print(f'found {process.name()} | {process.cmdline()}')
process.terminate()
except Exception:
print(f"{traceback.format_exc()}")
except Exception:
print(f"{traceback.format_exc()}")
I have basically extended @Giampaolo Rodolà's answer.
- Added exception handling
- Added check to see cmdline
I have also posted this snippet as a gist.
Note: You can remove the print statements once you are satisfied that the desired behavior is observed.
Solution 10 - Python
you can use WMI module to do this on windows, though it's a lot clunkier than you unix folks are used to; import WMI
takes a long time and there's intermediate pain to get at the process.
Solution 11 - Python
If you want to kill the process(es) or cmd.exe carrying a particular title(s).
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 )
Hope it helps. Their might be numerous better solutions to mine.
Solution 12 - Python
The Alex Martelli answer won't work in Python 3 because out
will be a bytes object and thus result in a TypeError: a bytes-like object is required, not 'str'
when testing if 'iChat' in line:
.
Quoting from subprocess documentation:
> communicate() returns a tuple (stdout_data, stderr_data). The data will be strings if streams were opened in text mode; otherwise, bytes.
For Python 3, this is solved by adding the text=True
(>= Python 3.7) or universal_newlines=True
argument to the Popen
constructor. out
will then be returned as a string object.
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)
Alternatively, you can create a string using the decode() method of bytes.
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)
Solution 13 - Python
In the same style as Giampaolo Rodolà' answer but as one liner, case insensitive and without having to match the whole process name, in windows you would have to include the .exe
suffix.
[x.kill() for x in psutil.process_iter() if 'ichat' in x.name().lower()]
Solution 14 - Python
You can use pkill <process_name>
in a unix system to kill process by name.
Then the python code will be:
>>> import os
>>> process_name=iChat
>>> os.system('pkill '+process_name)
Solution 15 - Python
For me the only thing that worked is been:
For example
import subprocess
proc = subprocess.Popen(["pkill", "-f", "scriptName.py"], stdout=subprocess.PIPE)
proc.wait()
Solution 16 - Python
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)
Solution 17 - Python
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()