An intro to Process Management in Linux

Let's take a look at

  • Viewing processes
  • Finding processes
  • Managing processes
  • Prioritizing processes
  • Killing processes
  • Running processes in the background
  • Scheduling processes

Viewing processes

The Linux Kernel assigns a unique process ID (PID) to each process sequentially, as the processes are created. In general, to perform any action on a process, we must specify the PID, sometimes we can use the name.

The ps command is the primary tool for viewing processes. Running it without any options lists the processes started (invoked) by the currently logged-in user and what processed are running on that terminal.

If we add the aux options

  • a = show processes for all users
  • u = display the process's user/owner
  • x = show processes not attached to a terminal

The processes are displayed in the order they were started, so you'll see in ordered by PID.

There are several columns are info, let's go over a few:

  • USER: The user who invoked the process.
  • PID: The process ID.
  • %CPU: The percent of CPU the process is using.
  • %MEM: The percent of memory the process is using.
  • COMMAND: The name of the command that started the process.

Finding Processes

We can use the grep command to find a specific process, let's say we want to find all processes with mfsconsole in the name

ps aux | grep msfconsole

We can use the top command to dynamically list processes ordered by resources used, starting with the largest. By default this list will refresh every 3 seconds.

top

Managing Processes

Priorities

The kernel will have the final say over the priority of a process, but we can use the nice command to suggest that a process should be elevated in priority. The values for nice range from -20 (most likely to receive priority) to +19 (least likely to receive priory).

A high nice value translates to a low priority (when you are being nice to other users and processes), and a low nice value translates to a high priority (when you are not being so nice to other users and processes).

When a process is started, all standard processes are launched with a nice value of 0.

We can use the nice command to set the nice value when a process is launched and we can use renice to adjust the nice value of a running process.

When we start a process using the nice command but without providing any value, the default nice value is 10.

The nice command requires that you increment the nice value, the renice command wants an absolute value for niceness.

Setting the Priority When Starting a Process with nice

We can use the nice command to adjust the nice value for a program as we launch it. This allows us to increase or decrease the priority given to the process by the kernel, relative to the other processes.

On the left, I've execute watch -n1 free to show me details on the system’s memory usage. On the left I've got top running and you can see that the watch command has PID 9717 and a nice value of 0.

Let's now execute the same watch command, except this time with the nice command.

nice -15 watch -n1 free

Now we see watch has a nice value of 15. A few things to keep in mind here:

  • The watch command has a different PID than the previous watch command. That's because nice will start a new process and not change an existing process.
  • With the nice command -15 means 15. If we wanted to specify a negative number (higher priorty) we would use double -
  • Here is what sudo nice --10 watch -n1 free would look like. Yes you have to use sudo if you are increasing priority. Anyone can decrease priority, only sudo can increase.

Changing the Priority of a Running Process with renice

The renice command takes absolute values between -20 and 19  and requieres the PID of the process.

Let's run our watch command again.

watch -n1 free

Let's check it's nice value, since we didn't specify it, it should be 0. Instead of using top I'll use ps and grep here, to simplify the output.

We can see the eighth column is 0, which is the nice value and the PID is the third column. Let's now use renice

sudo renice -15 14318

We can see that the nice value is now -15

We can also use the top utility to change the nice value.

In top hit R and supply a PID

Hit enter and provide new nice value

top has changed the nice value

Killing Processes

You can stop a problematic process with the kill command. The kill command has 64 different kill signals and the syntax is kill -signal PID If you don't provide a signal flag, it will default to SIGTERM. I'll focus on a few here.

SIGNAL NAME NUMBER DESCRIPTION
SIGHUP 1 The Hangup (HUP) signal. It stops the designated process and restarts it with the same PID.
SIGINIT 2 The Interrupt (INT) signal. It's a weak kill signal that isn't guaranteed to work, but does it cases.
SIGQUIT 3 The core dump. Terminates the process and saves the process information in memory, and then it save this information in the current working directory to a file named core.
SIGTERM 15 The Termination (TERM) signal. It is the kill command's default kill signal.
SIGKILL 9 This is the absolute kill signal. It forces the process to stop by sending the process's resources to a special device /dev/null.

This command would restart our watch command with the HUP signal.

kill -1 14318

This command would make certain that the process is terminated

kill -9 16318

If we don't know the PID we can use the killall command, it takes the name of the process.

killall -9 watch

Running Processes in the Background

When you execute a command, the shell waits until the command is complete before offering another command prompt. We can run a process in the background, it will continue to run without needing the terminal, freeing the terminal up for other jobs. We do this buy appending an ampersand to the end of a command.

geany sample.txt &

geany  is no longer taking up the entire terminal.

How do we bring it back to the foreground? Use the fg command with the PID

fg 18345

You can also move a process to the background using the bg command.

bg 18345

Scheduling Processes

In Linux we can schedule processes with at and crond. crond is a little more involved, I'll have a separate post for that.

The at command

The at command is useful for scheduling a job to run once at some point in the future. It sets up the atd daemon. A daemon is a program that sits in the background and does its thing without having any user interface.

The syntax is at followed by the time to execute the process. The time can be provided in various formats.

TIME FORMAT MEANING
at 7:20pm Run at 7:20 PM of current day.
at 7:20pm June 25 Run at 7:20 PM on June 25
at now + 20 minutes Run in 20 minutes
at 7:25pm 06/10/2021 Run at 7:25 pm on June 10, 2021
at noon

We can see that at puts us into interactive mode, here we type in the command we want executed at the specified time. Hit CTRL+D when you're done.

Use atq to list all scheduled at jobs.