Guide to Unix/Commands/Process Management/Kill

kill is a unix command used to send unix signals to running processus. By default it will try to send the TERM signal which will ask the process to stop it works hence the name kill.

Available signals are available from the kill command:

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     17) SIGCHLD
18) SIGCONT     19) SIGSTOP     20) SIGTSTP     21) SIGTTIN
22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO
30) SIGPWR      31) SIGSYS      33) SIGRTMIN    34) SIGRTMIN+1
35) SIGRTMIN+2  36) SIGRTMIN+3  37) SIGRTMIN+4  38) SIGRTMIN+5
39) SIGRTMIN+6  40) SIGRTMIN+7  41) SIGRTMIN+8  42) SIGRTMIN+9
43) SIGRTMIN+10 44) SIGRTMIN+11 45) SIGRTMIN+12 46) SIGRTMIN+13
47) SIGRTMIN+14 48) SIGRTMIN+15 49) SIGRTMAX-15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
$

You can send a given signal to all process having a given name or only to one process giving its PID. For example if you want to send signal SIGHUP to process 23154 :

kill -s SIGHUP 23154

If you want to send the same signal to all process named Apache :

kill -s SIGHUP Apache

You can also groups pid, the two commands above can be merged in:

kill -s SIGHUP 23154 Apache


Issuing signals, you can control your system a bit more. Say you have an ongoing script, running under PID 12345, which use a lot of your cpu and you would like to "pause" it while doing something else. You can issue your process the STOP signal:

kill -s STOP 12345

To later resume it, you will ask the process to CONTinue its work:

kill -s CONT 12345

Example:

We will start a simple process (sleep) in the background (&). The sleep process does nothing but waiting for the given number of seconds (in our case 360 seconds or 6 minutes):

$ sleep 360 &
[1] 7551
$

The shell give us back the PID of the process (7551). Let it run a bit then check its status with the ps command:

$ ps -o fname,pid,stat,etime
COMMAND    PID STAT     ELAPSED
bash      7425 Ss         04:47
sleep     7551 S          00:58
ps        7600 R+   49710-06:27:47
$

Now we ask our process to pause its work:

$  kill -s STOP 7551

Press enter to update your output buffer and the shell give you the confirmation:

$
[1]+  Stopped                 sleep 360
$

Sometime later, our process is still stopped:

$ ps -o fname,pid,stat,etime
COMMAND    PID STAT     ELAPSED
bash      7425 Ss         10:37
sleep     7551 T          06:05
ps        7719 R+   49710-06:27:47
$

You can notice that 6 minutes elapsed since the start although the process should have ended after 5 minutes (remember we used "sleep 360").

Now we want to tell the process to continue its operation:

$ kill -s CONT 7551

Update your buffer by pressing enter:

$
[1]+  Done                    sleep 360
$

Blam the process is finished. When you issued the CONT signal the process resumed and checked the current time, as more than 360 seconds have been elapsed it ended itself.