Reputation: 7633
I am running a Python program service_host.py, which started multiple processes. And when I use ps -ef | grep python
to check the pids, it shows a lot:
congmin 26968 22897 0 Jun20 ? 00:00:00 python service_host.py
congmin 26969 22897 0 Jun20 ? 00:00:00 python service_host.py
congmin 26970 22897 0 Jun20 ? 00:00:00 python service_host.py
congmin 26971 22897 0 Jun20 ? 00:00:00 python service_host.py
congmin 26972 22897 0 Jun20 ? 00:00:00 python service_host.py
congmin 26973 22897 0 Jun20 ? 00:00:00 python service_host.py
congmin 26974 22897 0 Jun20 ? 00:00:00 python service_host.py
congmin 26975 22897 0 Jun20 ? 00:00:00 python service_host.py
What's the best way to kill all these processes at once? I am on Linux and don't want to kill one by one through the process ID. Is there a way to kill them by the Python name 'service_host.py'? I tried this but it didn't kill at all:
import psutil
PROCNAME = "service_host.py"
for proc in psutil.process_iter():
# check whether the process name matches
if proc.name() == PROCNAME:
proc.kill()
Is there a terminal command that can do this job easily?
Upvotes: 6
Views: 21478
Reputation: 744
Using htop
instead you’ll be able to filter with F4
the processes service_host
instead and have a look at the whole tree with F5
. From there you can kill
them all at once with F9
...
Follow these simple 3 steps:
htop
F4
and type service_host
to filter the process to killF5
to sort processes as a tree. This organizes child processes to its primary process ID (PID)F9
for kill options15 SIGTERM
(signal terminate) to gracefully request to stop the proccess(es) or 9 SIGKILL
(signal kill) to forcefully shut down the process(es) and finally press enterI usually go with 9 SIGKILL
without worrying too much, but it's up to you and what you're doing within your python script!
Upvotes: 3
Reputation: 142641
Linux has command pkill
to kill by name
pkill python
exact matching
pkill -e 'python service_host.py'
check in full name
pkill -f 'service_host.py'
More in man pkill
BTW: There is also pgrep
to get PIDs using names.
Upvotes: 16
Reputation: 13079
You've tagged this with "python" and your script was close to doing the right thing, so here is a fixed version of your script -- use the cmdline
method to extract the command line as a list:
import psutil
PROCNAME = "service_host.py"
for proc in psutil.process_iter():
# check whether the process name matches
cmdline = proc.cmdline()
if len(cmdline) >= 2 and "python" in cmdline[0] and cmdline[1] == PROCNAME:
# print(proc)
proc.kill()
although various possibilities from the Linux command line are of course possible.
kill `ps -ef | grep "python service_host.py" | grep -v grep | awk '{print $2}'`
or whatever...
Upvotes: 5