Hi guys back to you after a long time.
However, the English that i am typing in here, might be a little murky as i am typing this one from chennai airport and there's no space to sit on .
Today we are going to look into a very important question which is :
Suppose you are running thousand or more instances of the VI editor process in your linux. Now you want to kill them in a single shot. How do you do it ?
Let's look at the good old grep-awk :
However, the English that i am typing in here, might be a little murky as i am typing this one from chennai airport and there's no space to sit on .
Today we are going to look into a very important question which is :
Suppose you are running thousand or more instances of the VI editor process in your linux. Now you want to kill them in a single shot. How do you do it ?
Let's look at the good old grep-awk :
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.
The problem with this method, however, is that you often end up killing more than you intended. Writing a reliable “some search” is tricky.
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
The problem :
- 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.
But, 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.
On AIX, it "cancels all processes that you started, except those producing the killall process."
Use Pkill :
pkill
is available on Linux, BSD and Solaris. So it has a bigger spread thankillall
.
But,
The problem :
pkill doesn't exist on AIX or HP-UX and despite what some people like to believe, there's still a significant based non-Linux UNIX out in the world.
What does pkill do :
pkill
is available in (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, runps -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.
All right that's all guys, i have to get my boarding pass now, or i will miss my flight .
See you next time .