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.
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.
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.
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()
psutil
package, that may not be present on the target machine. –
Holladay p = Process(name='MyProcess', target=long_running_func, args=(arg1,)) p.start()
but when I use the above code from the answer like so: if proc.name() == 'MyProcess':
psutil can't find it, I check using processId to find the process name python.exe, how do I solve this? I need to use my name and later search by it –
Terrill ps auxww | grep -E process name
? –
Wintry 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.
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')
If you have killall:
os.system("killall -9 iChat");
Or:
os.system("ps -C iChat -o pid=|xargs kill -9")
pkill
, although I think I'm the only person in the world that uses it instead of killall
–
Greeneyed killall java
? –
Priscilapriscilla pkill
because the only killall
I was aware of was the "kill everything" one. –
Overfeed 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()
this worked for me in windows 7
import subprocess
subprocess.call("taskkill /IM geckodriver.exe")
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)
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()
>>>
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.
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.
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.
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.
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)
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()]
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()
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)
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)
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()
© 2022 - 2024 — McMap. All rights reserved.