We're an ISO27001:2013 Certified Supplier

frustration

Sometimes we end up with lots of instances of one program running. Maybe backups are scheduled from cron but don’t use file locking. If one backup doesn’t finish before it’s time for the next one, you have two backup processes competing for the same resources, taking longer than expected…and before you know it, you have yet another backup process running. Of course, there are other causes of multiple similar processes running.

Sometimes we just want to stop them all. There are a number of way to kill multiple processes on a Linux server when normal daemon shutdown procedures don’t work, and we consider a few here.

The kill Command

This command is a misnomer: it actually sends a signal to a process, which may or may not kill that process. There are many types of signal, but the two that concern us here are TERM and SIGKILL. The first (the default) instructs a process to terminate in a controlled way, and the second forces the process to end immediately.

Selecting Processes To Kill: The Hard Way

One selection technique is to use the output of the ps command to generate a list of processes to kill. For example:

ps -o pid= -u freddy | xargs kill

That command will send a SIGTERM signal to every process run by user freddy. If -9 is appended to the above line, a SIGKILL signal will be sent instead.

How It Works

  • The ps command lists processes running on the system.
  • -o pid= option specifies that only the process ID (pid) should be output. The equals sign redefines the header for the column, in this case to nothing, so no header is output.
  • -u freddy restricts the listing to processes with an effective user ID of freddy
  • The xargs kill command will send a kill command to each PID passed to it.

Selecting Processes To Kill: The Easy Way

The above commands strings stemming from the output of ps work, and it can be instructive to understand how they work, but there are easier ways.

The killall Command

This command sends a signal to all processes running any of the commands specified. Like kill, by default a SIGTERM is sent. killall has a number of options, amongst them:

  • -I – ignore case
  • -i – ask for confirmation before killing each process
  • -o – only kill processes older than the time specified
  • -y – only kill processes younger than the time specified
  • -r – use a regex to select the processes

For example, the command below will send a signal (SIGTERM) to all processes running apache2 that have been running more than a week, and seeks confirmation before actually killing the process (note that there are better ways of simply stopping Apache under normal circumstances):

killall -io 1w apache2

If that fails – and only if you must kill Apache now – you can kill the processes with:

killall -9 -io 1w apache2

That will send a SIGKILL signal to all processes running apache2, forcing them to terminate immediately and abruptly.

Caution

Do not use this command on an HP-UX system because it will “do what it says on the tin” and kill all processes.

Introducing pgrep and pkill

pgrep will list the process IDs (“PID”) of all processes matching certain criteria. To list the PIDs of all apache2 processes:

pgrep apache2

To kill those processes:

pkill apache2

To kill all processes run by user freddy:

pkill -u fredddy

This avoids the long, convoluted command lines that usually start with a ps command.

Summary

The above techniques should be considered for emergency use only. It is far better to shut down runaway processes using the appropriate service or systemctl command.

As always, full details of the commands used above are documented in the man pages.

Could This Linux Tip Be Improved?

Let us know in the comments below.

Leave a Reply

Your email address will not be published. Required fields are marked *

Secure. Reliable. Scalable.

If that doesn't describe your current Linux systems, check out our FREE Linux Survival Guide to help you get your systems up to scratch today!

  • This field is for validation purposes and should be left unchanged.