Each command or program or bash script than runs on Linux is called process. It contains the program code and its current activity. On Linux each process has priority. I am not going into details about how this is managed. But I am going to write about real live scenarios where you can use priority parameter of the process. There is a command Linux (Nix) command called nice which manages process priority. We will look into some examples of usage of this command. On Linux or any other Nix operating system process priority is a number between -20 and 19. A niceness of −20 is the highest priority and 19 is the lowest priority. And this number tells operating system (OS) how much CPU time to give to this process compared to other processes.
When you start a program it usually has priority of 0. If you want to start a program with another priority you can use command nice which is installed by default on Ubuntu, Debian, Red Hat, Cent OS and any other Linux distros.
nice -n N command paramaters
When you start a nice without parameter like this default value of priority is 10.
nice command paramaters
Note that on most systems you do not need permissions to set lower priority (values above 0). But if you want to set higher priority (values below 0) then you need to be root or to modify file /etc/security/limits.conf and to add correct permission to user which will use this command.
But let’s start with examples. Let’s create one simple bash script that calculates pi up to 50 000 digits. Here is the script.
howopensource@debian:~/nice$ more pi.sh #!/bin/bash PI=$(echo "scale=50000; a(1)*4" | bc -l) echo $PI > pi.txt howopensource@debian:~/nice$
What the script does is simply to calculate PI, store it into a variable and then print it to some output file. Idea is to simulate a lot of CPU usage. For example this script but with a scale of 5000 (not 50 000) runs for about 30 seconds on my computer. I didn’t wait to calculate pi with scale of 50 000. But idea is to keep CPU busy and to experiment with processes.
First example is to run the script in background and then to type top to see what happened.
howopensource@debian:~/nice$ ./pi.sh &  9789 howopensource@debian:~/nice$ top
Then we do not need to wait to program to finish. Simply type fg to bring process into foreground and then interrupt it with Ctrl+C. Command fg comes from foreground and idea is to bring process into foreground. Remember when you start command with & then it runs in background, so while this program runs you can run another program or script. At the end you can run top to verify that program stopped running.
Next step is to run the same command with lower priority. Remember priority range is from -20 to 19, when you run program in a normal way it starts with priority 0 and when you run script with nice without parameters then default priority is 10. So let’s see what happened.
howopensource@debian:~/nice$ nice ./pi.sh &  9844 howopensource@debian:~/nice$ top
Next experiment is to run the same command two times – once without nice with default priority of 0 and second time with nice and default priority of 10. We should see than process with priority 0 occupies more CPU time. Here is the scenario and the output of it.
howopensource@debian:~/nice$ ./pi.sh &  9868 howopensource@debian:~/nice$ nice -n 10 ./pi.sh &  9873 howopensource@debian:~/nice$ top
Where to use nice command
Here are some practical ideas where you can use it. For example I backup this web site each night with a cron job. And script that runs is very simple. It simply calls tar and mysqldump commands. Here is the simple backup script that handles backup of HowOpenSource.com.
#!/bin/bash cd /home/howopensource/backup DF=`date +%Y%m%d` nice -n 15 tar -cf wp-$DF.tar /var/www/HowOpenSource nice -n 15 gzip wp-$DF.tar nice -n 15 mysqldump -u root -p****** wpdb_howopensource > wpdb-$DF.sql nice -n 15 gzip wpdb-$DF.sql
The idea is to backup site data during the night but to start backup processes with lowest priority in order to give more CPU time to Apache and MySQL to process user requests. You can use nice in similar places like cron jobs that do maintenance job and do not need higher priority.