Process Control
Slackware systems often run hundreds or thousands of programs, each of
which is refered to as a process. Managing these processes is an
important part of system administration. So how exactly do we handle
all of these seperate processes?
ps
The first step in managing processes is figuring out what processes are
currently running. The most popular and powerful tool for this is
ps(1). Without any arguments,
ps won't tell you much information. By
default, it only tells you what processes are running in your currently
active shell. If we want more information, we'll need to look deeper.
darkstar:~$ ps
PID TTY TIME CMD
12220 pts/4 00:00:00 bash
12236 pts/4 00:00:00 ps
Here you can see what processes you are running in your currently
active shell or terminal and only some information is included. The
PID is the "Process ID"; every process is assigned a unique number. The
TTY tells you what terminal device the process is attached to.
Naturally, CMD is the command that was run. You might be a little
confused by TIME though, since it seems to move so slowly. This isn't
the amount of real time the process has been running, but rather the
amount of CPU time the process has consumed. An idle process uses
virtually no CPU time, so this value may not increase quickly.
Viewing only our own processes isn't very much fun, so let's take a
look at all the processes on the system with the -e
argument.
darkstar:~$ ps -e
PID TTY TIME CMD
1 ? 00:00:00 init
2 ? 00:00:00 kthreadd
3 ? 00:00:00 migration/0
4 ? 00:00:00 ksoftirqd/0
7 ? 00:00:11 events/0
9 ? 00:00:01 work_on_cpu/0
11 ? 00:00:00 khelper
102 ? 00:00:02 kblockd/0
105 ? 00:01:19 kacpid
106 ? 00:00:01 kacpi_notify
... many more lines ommitted ...
The above example uses the standard ps
syntax, but much more information can be discovered if we use BSD
syntax. In order to do so, we must use the aux argument.
This is distinct from the -aux argument, but in most cases
the two arguments are equivilant. This is a decades-old relic. For more
information, see the man page for ps.
darkstar:~$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 3928 632 ? Ss Apr05 0:00 init [3]
root 2 0.0 0.0 0 0 ? S< Apr05 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S< Apr05 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S< Apr05 0:00 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S< Apr05 0:11 [events/0]
root 9 0.0 0.0 0 0 ? S< Apr05 0:01 [work_on_cpu/0]
root 11 0.0 0.0 0 0 ? S< Apr05 0:00 [khelper]
... many more lines ommitted ....
As you can see, BSD syntax offers much more information, including what
user controls the process and what percentage of RAM and CPU the process
is consuming when ps is run.
Finally, ps can also create a process tree.
This shows you which processes have children processes. Ending the
parent of a child process also ends the child. We do this with the
-ejH argument.
darkstar:~$ ps -ejH
... many lines ommitted ...
3660 3660 3660 tty1 00:00:00 bash
29947 29947 3660 tty1 00:00:00 startx
29963 29947 3660 tty1 00:00:00 xinit
29964 29964 29964 tty7 00:27:11 X
29972 29972 3660 tty1 00:00:00 sh
29977 29972 3660 tty1 00:00:05 xscreensaver
29988 29972 3660 tty1 00:00:04 xfce4-session
29997 29972 3660 tty1 00:00:16 xfwm4
29999 29972 3660 tty1 00:00:02 Thunar
... many more lines ommitted ...
As you can see, ps is an incredibly powerful
tool for determining not only what processes are currently active on
your system, but also for learning lots of important information about
them.
kill and killall
Managing processes isn't only about knowing which ones are running, but
also about communicating with them to change their behavior. The most
common way of managing a program is to terminate it. Thus, the tool for
the job is named kill(1). Despite the name,
kill doesn't actually terminate processes,
but sends signals to them. The most common signal is a SIGTERM, which
tells the process to finish up what it is doing and terminate. There
are a variety of other signals that can be sent, but the three most
common are SIGTERM, SIGHUP, and SIGKILL.