Let's take a look at
- Viewing processes
- Finding processes
- Managing processes
- Prioritizing processes
- Killing processes
- Running processes in the background
- Scheduling 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.
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
- 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
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.
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.
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).
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.
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
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 -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
PIDthan the previous watch command. That's because
nicewill start a new process and not change an existing process.
- With the nice command
-15means 15. If we wanted to specify a negative number (higher priorty) we would use double -
- Here is what
sudo nice --10 watch -n1 freewould 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 command takes absolute values between -20 and 19 and requieres the
PID of the process.
Let's run our watch
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
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
sudo renice -15 14318
We can see that the
nice value is now
We can also use the
top utility to change the
R and supply a
Hit enter and provide new
top has changed the
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.
|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
You can also move a process to the background using the
In Linux we can schedule processes with
crond is a little more involved, I'll have a separate post for that.
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.
|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|
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.
atq to list all scheduled