Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

This is one of the questions that has troubled me often. Suppose I have thousand or more instances of any process(for e.g. say the process vi) running. How do I kill them all in one single shot/one line command/One command ? Any information provided will be appreciated ?

share|improve this question
    
any more answers are welcome .... –  The Dark Knight Oct 11 '12 at 8:30
2  
It is unclear for what systems you intend this to work. For instance, on Linux I use pkill from procps package. –  Deer Hunter Oct 11 '12 at 9:55
    
The question was asked from a general point of view . I knew of only two processes like killall and via the awk/sed. But i wanted to know whether there are other ways of achieving this. If it is differently done in different systems, then i want to know what in which. It's very cumbersome to google, instead i thought of discussing with all of you experienced guys. –  The Dark Knight Oct 11 '12 at 15:35
add comment

6 Answers

up vote 8 down vote accepted

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.

share|improve this answer
    
Up voted, knew of only the first variation. The second looks more efficient, thank you . –  The Dark Knight Oct 11 '12 at 15:38
    
@TheDarkKnight The problem with this method is that you often end up killing more than you intended. Writing a reliable “some search” is tricky. Under Linux, use pkill, which handles most of the subtleties. –  Gilles Oct 11 '12 at 22:55
    
I'm not sure it's that tricky, if you're after a specific binary it can be pretty reliable. I always run it as an echo kill -9 $pid first anyway so I know what I'm getting. I'm not sure AIX has pkill, which is my bread and butter UNIX. And is it really bad enough to be down-voted - odd. –  EightBitTony Oct 12 '12 at 7:08
    
Unless absolutely necessary, you should send the process SIGTERM instead of SIGKILL. –  Evan Teitelman Jun 29 '13 at 16:25
add comment

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

share|improve this answer
    
That's right, you can also add the signal you want, like killall -9 vi –  Hola Soy Edu Feliz Navidad Oct 11 '12 at 7:19
    
I don't think killall is the naswer to it : Killing by file only works for executables that are kept open during execution, i.e. impure executables can't be killed this way. Typing killall name may not have the desired effect on non-Linux systems, especially when done by a privileged user.What if i am trying to delete a lot of instances of some non-linux process ? killall -w doesn't detect if a process disappears and is replaced by a new process with the same PID between scans. If processes change their name, killall may not be able to match them correctly. –  The Dark Knight Oct 11 '12 at 7:26
7  
Please be aware that this only works on Linux and BSD. On Solaris and some other systems killall does exactly what the name suggests...it kills the init-process. –  Bobby Oct 11 '12 at 9:20
    
Huh... thanks Bobby,I didn't know that . –  The Dark Knight Oct 11 '12 at 15:37
1  
On AIX, it "cancels all processes that you started, except those producing the killall process." –  EightBitTony Oct 12 '12 at 9:54
add comment

Why don't you try:

kill -9 vi*
share|improve this answer
2  
What kind of killall you use? My killall from the psmisc package only accepts strings and regular expression (when the -r switch is specified). –  manatwork Oct 11 '12 at 11:06
1  
On AIX, "killall [ - ] [ -Signal ]" and "The killall command cancels all processes that you started" –  EightBitTony Oct 12 '12 at 9:52
add comment

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

share|improve this answer
    
Not available on all UNIXes, and no mention of a specific UNIX or UNIX-like OS in the question. –  EightBitTony Oct 12 '12 at 9:50
    
@EightBitTony pkill is available on Linux, BSD and Solaris - afaik. So it has a bigger spread than killall. –  Nils Oct 12 '12 at 11:12
    
I agree, but killall is even more problematic because there are multiple tools with the same name, that have dramatically different behaviour it would seem. I don't like the killall answers either. pkill doesn't exist on AIX or HP-UX and despite what some people like to believe, there's still a significant based of non-Linux UNIX out in the world. –  EightBitTony Oct 12 '12 at 12:21
    
@EightBitTony that is why your answer is the accepted one. But I would not use it on Solaris (which is Unix, too). –  Nils Oct 12 '12 at 19:18
add comment

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.

share|improve this answer
    
Thanks a lot, this is really awesome. What you have given is a kind of a tutorial. Thanks again . Up voted –  The Dark Knight Oct 15 '12 at 6:20
add comment

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

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.