Kill many instances of a running process with one command

Suppose I have a thousand or more instances of any process (for example, vi) running. How do I kill them all in one single shot/one line command/one command?

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

What’s wrong with the good old,

for pid in $(ps -ef | grep "some search" | awk '{print $2}'); do kill -9 $pid; done

There are ways to make that more efficient,

for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done

and other variations, but at the basic level, it’s always worked for me.

Method 2

Use killall,

killall vi

This will kill all command named ‘vi’

You might also add a signal as well, e.g SIGKILL

killall -9 vi

Method 3

pkill is what I recommend, if it’s available (Linux, FreeBSD, NetBSD, OpenBSD, Solaris). You can specify processes by the command name, by the full command line or other criteria. For example, pkill vi kills all programs whose command name contains the substring vi. To kill only processes called vi, use pkill -x vi. To kill only processes called vi with a last argument ending in .conf, use pkill -fx 'vi.*.conf'.

To see the list of PIDs that pkill would send a signal to, use pgrep, which has exactly the same syntax except that it doesn’t accept a signal name or number. To see more information about these processes, run

ps -p "$(pgrep …)"

Under Linux, you need ps -p $(pgrep -d, …) instead (that’s a bug: Linux’s ps isn’t POSIX-compliant).

Another common way to identify processes to kill is the processes that have a certain file open (which can be the process’s executable). You can list these with fuser; use fuser -k to send them a signal. For example, fuser -k /usr/bin/find kills all running isntances of find.

If there’s a runaway process that keeps forking, you may need to kill the whole process group at once. A process group is identified by the negative of its leader, which is the ancestor process of all the processes in the group. To see the process group that a process belongs to, run ps -o pgid (plus any option to select which process(es) to display). If you determine that you want to kill the process group leader 1234 and all its children, run kill -1234 or kill -HUP -1234 or any other signal.

If you can’t find a better way, use ps with proper options to list all processes and filter it with grep or some other text filtering command. Take care not to accidentally match other processes that happen to be running a command with a similar name, or with an argument that contains that name. For example:

kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')

Remember that your grep or awk command itself may be listed in the ps output (ps and the filtering command are started in parallel, so whether it will show up or not is dependent on timing). This is particularly important if the command arguments are included in the ps output.

Method 4

The easiest way to do is first check you are getting right process IDs with:

pgrep -f [part_of_a_command]

If the result is as expected. Go with:

pkill -f [part_of_a_command]

Method 5

pkill is very nice here. You can give it lots of parameters to refine the pattern.

Method 6

I would suggest you to try pkill.

Ex: ps -ef | pkill -f command

To show the list of all the processes to be killed first try to pgrep:

Ex: ps -ef | pgrep -f command

Method 7

Interesting no one mentioned this one. pidof outputs space-separated pids of processes matching the passed process name. As such, you can directly use its output with kill without piping. On Arch Linux I use

kill -9 $(pidof <proc name>)

The downside to this solution being that it does not allow for use of regular expressions.

Method 8

You can kill multiple different processes by using the command below

pkill -9 -f "./.+s.|process1|process2|process3[^"

Note that this will kill the process that matches the above pattern, means process1abc process2def process3ghi will also get killed.

Method 9

pgrep "name-of-application" | xargs kill -9

Was simple enough to remember and worked nicely for me.

Method 10

ps -ef | pgrep -f "search" | xargs kill -9

Method 11

write this and name as killer.sh 🙂 infinity loop and killing process

#!/bin/bash
while :
do
    echo "Press [CTRL+C] to stop.."
    for pid in $(ps -ef | awk '/your process name/ {print $2}'); do kill -9 $pid; done  
    # credit to above answer 
    sleep 1
done

Method 12

$ ps -eaf  | grep "xyz" | grep -v grep | awk 'print $2' | xargs kill


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x