发信人: jerk (徐子陵), 信区: Unix
标  题: Unix Unleased -19
发信站: 饮水思源站 (Fri Nov 20 20:20:12 1998) , 站内信件

    
    19 — Administering Processes 
                    By Rachel and Robert Sartin
            Monitoring Processes—ps and time 
                What Is ps? 
                Introduction to SYSV ps Output 
                Introduction to BSD ps Output 
                Checking on Your Processes with ps 
                    Everything You Own 
                    Specific Processes 
                    Specific Process Groups 
                    Specific Terminal 
                    Specific User
                Checking on a Process with time
            Background and Foreground Processes 
                Foreground Processing 
                Where Is the Background and Why Should You Go There? 
                Job Control
            Signaling Processes 
            Killing Processes 
                The kill Command 
                Finding What to Kill Using ps 
                    Determining Which Signal to Send
                The dokill Script An Example
            Logging Out with Background Processes 
                Using nohup
            Prioritizing Processes 
                What Is a Priority? 
                Being Nice 
                Using renice on a Running Process
            Job Control and Process Groups 
                Using the jobs Command 
                Putting Jobs in the Foreground 
                Suspending Process Groups 
                Putting Jobs in the Background 
                Using wait to Wait for Background Jobs 
                Using csh notify to Learn About Changes Sooner
            My System Is Slow—Performance Tuning 
                Monitoring the System with ps 
                Monitoring the System with sar
            Summary

19 — Administering Processes 

By Rachel and Robert Sartin 

You use processes on UNIX every time you want to get something done. Each 
command (that isn't built into your shell) you run will start one or more new 
processes to perform your desired task. To get the most benefit out of your UNIX 
machine you need to learn how to monitor and control the processes that are 
running on it. You will need to know how to make large, but not time-critical, 
tasks take less of your CPU time. You will need to learn how to shut down 
programs that have gone astray. You will need to learn how to improve the 
performance of your machine. 

Monitoring Processes—ps and time 

The first step in controlling processes in UNIX is to learn how to monitor them. 
By using the process-monitoring commands in UNIX, you will be able to find what 
programs are using your CPU time, find jobs that are not completing, and 
generally explore what is happening to your machine. 

What Is ps? 

The first command you should learn about is the ps command, which prints out the 
process status for some or all of the processes running on your UNIX machine. 

There are two distinctly different versions of ps: the SYSV version and the BSD 
version. Your machine might have either one or both of the ps commands. If you 
are running on a machine that is mostly based on Berkeley UNIX, try looking in 
/usr/5bin for the SYSV version of ps. If you are running on a machine that is 
mostly based on System V UNIX, try looking in /usr/ucb for the BSD version of 
ps. Check your manuals and the output of your ps program to figure out which one 
you have. You may want to read the introductions to both SYSV and BSD ps output 
since some systems either combine features of both (for example, AIX) or have 
both versions (for example, Solaris 2.3, which has SYSV /usr/bin/ps and BSD 
/usr/ucb/ps). 

Introduction to SYSV ps Output 

If you are using SYSV, you should read this section to learn about the meaning 
of the various fields output by ps. 

Look at what happens when you enter ps: 

$ ps



   PID TTY      TIME COMD



  1400 pts/5    0:01 sh



  1405 pts/5    0:00 ps




The PID field gives you the process identifier, which uniquely identifies a 
particular process. The TTY fields tell what terminal the process is using. It 
will have ? if the process has no controlling terminal. It may say console if 
the process is on the system console. The terminal listed may be a pseudo 
terminal, which is how UNIX handles terminal-like connections from a GUI or over 
the network. Pseudo terminal names often begin with pt (or just p, if your 
system uses very short names). The TIME field tells how much CPU time the 
process has used. The COMD field (sometimes labelled CMD or COMMAND) tells what 
command the process is running. 

Now look at what happens when you enter ps -f: 

$ ps -f



     UID   PID  PPID  C    STIME TTY      TIME COMD



  sartin  1400  1398 80 18:31:32 pts/5    0:01 -sh



  sartin  1406  1400 25 18:34:33 pts/5    0:00 ps -f



$
The UID field tells which user ID owns the process. Your login name should 
appear here. The PPID field tells the process identifier of the parent of the 
process; notice that the PPID of ps -f is the same as the PID of -sh. The C 
field is process-utilization information used by the scheduler. The STIME is the 
time the process started. 

Next, look at what happens when you enter ps -l: 

$ ps -l



 F S   UID   PID  PPID  C PRI NI     ADDR     SZ    WCHAN TTY      TIME COMD



 8 S   343  1400  1398 80   1 20 fc315000    125 fc491870 pts/5    0:01 sh



 8 O   343  1407  1400 11   1 20 fc491800    114          pts/5    0:00 ps



$
Note that the UID is printed out numerically this time. The PRI field is the 
priority of the process; a lower number means more priority to the scheduler. 
The NI field is the nice value. See the section "Prioritizing Processes" for 
more information on the scheduler and nice values. The SZ field shows the 
process size. The WCHAN field tells what event, if any, the process is waiting 
for. Interpretation of the WCHAN field is specific to your system. 

On some SYSV systems with real-time scheduling additions, you may see output 
such as the following if you enter ps -c: 

$ ps -c



   PID  CLS PRI TTY      TIME COMD



  1400   TS  62 pts/5    0:01 sh



  1409   TS  62 pts/5    0:00 ps




The CLS field tells the scheduling class of the process; TS means time sharing 
and is what you will usually see. You may also see SYS for system processes and 
RT for real-time processes. 

On some SYSV systems running the Fair Share Scheduler, you may see output such 
as the following if you enter ps -f: 

$ ps -f



     UID    FSID   PID  PPID  C    STIME TTY      TIME COMMAND



  sartin rddiver 18735 18734  1  Mar 12  ttys0    0:01 -ksh



  sartin rddiver 19021 18735  1 18:47:37 ttys0    0:01 xdivesim



  sartin rddiver 19037 18735  4 18:52:58 ttys0    0:00 ps -f



    root default 18734   136  0  Mar 12  ttys0    0:01 rlogind




The extra FSID field tells the fair share group for the process. 

Introduction to BSD ps Output 

If you are using BSD, you should read this section to learn about the meaning of 
the various fields output by ps. 

Look at what happens when you enter ps: 

$ ps



  PID TT STAT  TIME COMMAND



22711 c0 T     0:00 rlogin brat



22712 c0 T     0:00 rlogin brat



23121 c0 R     0:00 ps




The PID field gives you the process identifier, which uniquely identifies a 
particular process. The TT fields tell what terminal the process is using. It 
will have ? if the process has no controlling terminal. It may say co if the 
process is on the system console. The terminal listed may be a pseudo terminal. 
The STAT field shows the process state. Check your manual entry for ps to learn 
more about state. The TIME field tells how much CPU time the process has used. 
The COMMAND field tells what command the process is running. Normally, the 
COMMAND field lists the command arguments stored in the process itself. On some 
systems, these arguments can be overwritten by the process. If you use the c 
option, the real command name will be given, but not the arguments. 



NOTE: The BSD ps command predates standard UNIX option processing. It does not 
take hyphens to introduce options. On systems where one ps acts like either SYSV 
or BSD (e.g., AIX ps), the absence of the hyphen is what makes it run in BSD 
mode. 



Look at what happens when you enter ps l: 

$ ps l



       F UID   PID  PPID CP PRI NI  SZ  RSS WCHAN    STAT TT  TIME COMMAND



20408020 343 22711 22631  0  25  0  48    0          TW   c0  0:00 rlogin brat



    8000 343 22712 22711  0   1  0  48    0 socket   TW   c0  0:00 rlogin brat



20000001 343 23122 22631 19  29  0 200  400          R    c0  0:00 ps l




The F field gives a series of flags that tell you about the current state of the 
process. Check your system manuals for information on interpreting this field. 
The UID field tells the user ID that owns the process. Your login name should 
appear here. The PPID field tells the process identifier of the parent of the 
process; notice that the PPID of the second rlogin is the same as the PID of the 
other, its parent process. The CP is process utilization information used by the 
scheduler. The PRI field is the priority of the process; a lower number means 
more priority to the scheduler. See the section "Prioritizing Processes" for 
more information on the scheduler. The SZ field shows the process size. The RSS 
field shows the resident set size, which is the actual amount of computer memory 
occupied by the process. The WCHAN field tells what event, if any, the process 
is waiting for. Interpretation of the WCHAN field is specific to your system. 

Look at what happens when you enter ps u: 

$ ps u



USER       PID %CPU %MEM   SZ  RSS TT STAT START  TIME COMMAND



sartin   23127  0.0  1.6  200  416 c0 R    19:25   0:00 ps u



sartin   22712  0.0  0.0   48    0 c0 TW   18:40   0:00 rlogin brat



sartin   22711  0.0  0.0   48    0 c0 TW   18:40   0:00 rlogin brat



$
The %CPU and %MEM fields tell the percentage of CPU time and system memory the 
process is using. The START field tells when the process started. 

$ ps v



  PID TT STAT  TIME SL RE PAGEIN SIZE  RSS   LIM %CPU %MEM COMMAND



23126 c0 R     0:00  0  0      0  200  420    xx  0.0  1.6 ps



$
The SL field tells how long the process has been sleeping, waiting for an event 
to occur. The RE field tells how long the process has been resident in memory. 
The PAGEIN field tells the number of disk input operations caused by the 
process, to read in pages that were not already resident in memory. The LIM 
field tells the soft limit on memory used. 

Checking on Your Processes with ps 

This section gives a few handy ways to examine the states of certain processes 
you might care about. Short examples are given using the SYSV and BSD versions 
of ps. 

Everything You Own 

Viewing all processes that you own can be useful in looking for jobs that you 
accidentally left running or to see everything you are doing so you can control 
it. On SYSV, you type ps -u userid to see everything owned by a particular user. 
Try ps -u $LOGNAME to see everything you own: 

$ ps -u $LOGNAME



   PID TTY      TIME COMMAND



  18743 ttys0    0:01 ksh



  19250 ttys0    0:00 ps




On BSD, the default is for ps to show everything you own: 

$ ps l



       F UID   PID  PPID CP PRI NI  SZ  RSS WCHAN    STAT TT  TIME COMMAND



20088201 343   835   834  1  15  0  32  176 kernelma S    p0  0:00 -ksh TERM=vt



20000001 343   861   835 25  31  0 204  440          R    p0  0:00 ps l



20088001 343   857   856  0   3  0  32  344 Heapbase S    p1  0:00 -ksh HOME=/t




Specific Processes 

Looking at the current status of a particular process can be useful to track the 
progress (or lack thereof) of a single command you have running. On SYSV you 
type ps -pPID ... to see a specific process: 

$ ps -p19057



   PID TTY      TIME COMMAND



  19057 ttys3    0:00 ksh




On BSD, if the last argument to ps is a number, it is used as a PID: 

$ ps l22712



       F UID   PID  PPID CP PRI NI  SZ  RSS WCHAN    STAT TT  TIME COMMAND



    8000 343 22712 22711  0   1  0  48    0 socket   TW   c0  0:00 rlogin brat



$
Specific Process Groups 

Looking at the status of a process group (See the section "Job Control and 
Process Groups.") can be useful in tracking a particular job you run. On SYSV 
you can use ps -gPGID to see a particular process group: 

$ ps -lg19080



  F S   UID   PID  PPID  C PRI NI     ADDR   SZ    WCHAN TTY      TIME COMD



  1 S   343 19080 19057  0 158 24   710340   51   39f040 ttys3    0:58 fin_analysis



  1 S   343 19100 19080  0 168 24   71f2c0   87 7ffe6000 ttys3    2:16 fin_marketval




On BSD, there is no standard way to see a particular process group, but the 
output of ps j gives much useful information: 

$ ps j



 PPID   PID  PGID   SID TT TPGID  STAT   UID  TIME COMMAND



  834   835   835   835 p0   904   SOE   198  0:00 -ksh TERM=vt100 HOME=/u/sart



  835   880   880   835 p0   904   TWE   198  0:00 vi



  835   881   881   835 p0   904   TWE   198  0:00 vi t1.sh



  835   896   896   835 p0   904   IWE   198  0:00 ksh t2.sh _ /usr/local/bin/k



  896   897   896   835 p0   904   IWE   198  0:00 task_a



  896   898   896   835 p0   904   IWE   198  0:00 task_b



  835   904   904   835 p0   904    RE   198  0:00 ps j



$
Note the PGID field for PIDs 896—898, which are all part of one shell script. 
Note the TPGID field, which is the same for all processes and identifies the 
current owner of the terminal. 

Specific Terminal 

Looking at the status of a particular terminal can be a useful way to filter 
processes started from a particular login, either from a terminal or over the 
network. On SYSV use ps -t termid to see processes running from a particular 
terminal or pseudo terminal. (See your system documentation to determine the 
correct values for termid.) 

$ ps -fts3



     UID   PID  PPID  C    STIME TTY      TIME COMMAND



    root 19056   136  0 19:21:00 ttys3    0:00 rlogind



  sartin 19080 19057  0 19:23:53 ttys3    1:01 fin_analysis



  sartin 19057 19056  0 19:21:01 ttys3    0:00 -ksh



  sartin 19100 19080  0 19:33:53 ttys3    3:43 fin_marketval



  sartin 19082 19057  0 19:23:58 ttys3    0:00 vi 19unxor.adj




On BSD use ps t termid to see processes running from a particular terminal or 
pseudo terminal (See your system documentation to determine the correct values 
for termid.): 

$ ps utp5



USER       PID  %CPU %MEM   SZ  RSS TT STAT  TIME COMMAND



sartin    2058   0.0  0.9  286      p5 R     0:00 -sh (sh)



sartin    2060   0.0  2.7   53      p5 R     0:00 vi 19unxor.adj




Specific User 

Looking at processes run by a particular user can be useful for the system 
administrator to track what is being run by others and to deal with "runaway" 
processes. On SYSV enter ps -u userid to see everything owned by a particular 
user: 

$ ps -fusartin



     UID   PID  PPID  C    STIME TTY      TIME COMMAND



  sartin 18743 18735  0  Mar 12  ttys0    0:31 collect_stats



  sartin 19065 19057  1 19:21:04 ttys3    0:00 vi 19unxor.adj



  sartin 19057 19056  0 19:21:01 ttys3    0:00 -ksh



  sartin 18735 18734  0  Mar 12  ttys0    0:00 -ksh



  sartin 19066 18743  8 19:21:12 ttys0    0:00 ps -fusartin




On BSD, there is no simple, standard way to see processes owned by a particular 
user other than yourself. 

Checking on a Process with time 

The time command prints out the real, system, and user time spent by a command 
(in ksh, the built-in time command will time a pipeline as well). The real time 
is the amount of clock time it took from starting the command until it 
completed. This will include time spent waiting for input, output, or other 
events. The user time is the amount of CPU time used by the code of the process. 
The system time is the amount of time the UNIX kernel spent doing things for the 
process. The time command prints real, user, and sys times on separate lines 
(BSD time may print them all on one line). Both csh and ksh have built-in 
versions of time that have slightly different output formats. The csh built-in 
time command prints user time, system time, clock time, percent usage, and some 
I/O statistics all on one line. The ksh time built-in time command prints real, 
user, and sys time on separate lines, but uses a slightly different format for 
the times than does time: 

% time ./doio



9.470u 0.160s 0:09.56 100.7% 0+99k 0+0io 0pf+0w



% ksh



$ time ./doio



real    0m9.73s



user    0m9.63s



sys     0m0.10s



$ sh



$ time ./doio



real        9.8



user        9.5



sys         0.1




Background and Foreground Processes 

So far, you have seen examples and descriptions of a user typing a command, 
watching as it executes, possibly interacting during its execution, and 
eventually completing. This is the default way your interactive shell executes 
processes. Using only this order of events means your shell executes a single 
process at a time. This single process is running in the foreground. Shells are 
able to keep track of more than one process at a time. In this type of 
environment, one process at most can be in the foreground; all the other 
processes are running in the backgound. This allows you to do multiple things at 
once from a single screen or window. You can think of the foreground and the 
background as two separate places where your interactive shell keeps processes. 
The foreground holds a single process, and you may interact with this process. 
The background holds many processes, but you cannot interact with these 
processes. 

Foreground Processing 

Running a process in the foreground is very common—it is the default way your 
shell executes a process. If you want to write a letter using the vi editor, you 
enter the command vi letter and type away. After you enter the vi command, your 
shell starts the vi process in the foreground so you can write your letter. In 
order for you to enter information interactively, your process must be in the 
foreground. When you exit the editor, you are terminating the process. After 
your foreground process terminates, but not before, the shell prompts you for 
the next command. 

This mode of execution is necessary for all processes that need your 
interactions. It would be impossible for the computer to write the letter you 
want without your input. Mind reading is not currently a means of input, so you 
commonly type, use your mouse, and even sometimes speak the words. But not all 
processes need your input—they are designed to be able to get all the necessary 
input via other ways. They may be designed to get input from the computer 
system, from other processes, or from the file system. 

Still, such processes may be designed to give you information. Status 
information could be reported periodically, and usually the process results are 
displayed at a certain point. If you wish to see this information as it is 
reported, the process must be running in the foreground. 

Where Is the Background and Why Should You Go There? 

Sometimes a program you run doesn't need you to enter any information or view 
any results. If this is the case, there is no reason you need to wait for it to 
complete before doing something else. UNIX shells provide a way for you to 
execute more than one process at a time from a single terminal. The way you do 
this is to run one or more processes in the background. The background is where 
your shell keeps all processes other than the one you are interacting with (your 
foreground process). You cannot give input to a process via standard input while 
it is in the background—you can give input via standard input only to a process 
in the foreground. 

The most common reason to put a process in the background is to allow you to do 
something else interactively without waiting for the process to complete. For 
example, you may need to run a calculation program that goes through a very 
large database, computing a complicated financial analysis of your data and then 
printing a report; this may take several minutes (or hours). You don't need to 
input any data because your database has all the necessary information. You 
don't need to see the report on your screen since it is so big you would rather 
have it saved in a file and/or printed on your laser printer. So when you 
execute this program, you specify that the input should come from your database 
(redirection of standard input) and the report should be sent to a file 
(redirection of standard output). At the end of the command you add the special 
background symbol, &. This symbol tells your shell to execute the given command 
in the background. Refer to the following example scenario. 

$ fin_analysis < fin_database > fin_report &



[1]   123



$ date



Sat Mar 12 13:25:17 CST 1994



$ tetris



$ date



Sat Mar 12 15:44:21 CST 1994



[1] +  Done             fin_analysis < fin_database > fin_report &




After starting your program on its way (in the background), the shell prints a 
prompt and awaits your next command. You may continue doing work (executing 
commands) while the calculation program runs in the background. When the 
background process terminates (all your calculations are complete), your shell 
may print a termination message on your screen, followed by a prompt. 

Job Control 

Some shells (C shell, csh, and Korn shell, ksh, are two) have increased ability 
to manipulate multiple processes from a single interactive shell. Although 
graphical interfaces have since added the ability to use multiple windows (each 
with it's own interactive shell) from one display, job control still provides a 
useful function. 

First you need to understand the shell's concept of a job. A job is an executed 
command line. Recall the discussion of processes created during execution of a 
command. For many command lines (for example, pipelines of several commands), 
several processes are created in order to carry out the execution. The whole 
collection of processes that are created to carry out this command line belong 
to the same process group. By grouping the processes together into an 
identifiable unit, the shell allows you to perform operations on the entire job, 
giving you job control. 

Job control allows you to do the following: 

    Move processes back and forth between the foreground and background 
    
    
    Suspend and resume process execution 
    
    
Each job or process group has a controlling terminal. This is the terminal (or 
window) from which you executed the command. Your terminal can only have one 
foreground process (group) at a time. A shell that implements job control will 
move processes between the foreground and the background. 

The details of job control use are covered in the section "Job Control and 
Process Groups." 

Signaling Processes 

When a process is executing, UNIX provides a way to send a limited set of 
messages to this process: It sends a signal. UNIX defines a set of signals, each 
of which has a special meaning. Then the user, or other processes that are also 
executing, can send a specific signal to a process. This process may ignore some 
signals, and it may pay attention to others. As a nonprogramming user, you 
should know about the following subset of signals. The first group is important 
for processes, no matter what shell you are using. The second group applies if 
your shell supports job control. 

General Process Control Signals 

HUPDetection of terminal hangup or controlling process death
            INTInteractive attention signal—INTR control character generates 
            this
            KILLTermination—process cannot ignore or block this
            QUITInteractive termination—QUIT control character generates this
            TERMTermination—process may ignore or block this
    
Job Control Process Control Signals 

CONTContinue a stopped process—process cannot ignore or block this
            STOPStop a process—process cannot ignore or block this
            TSTPInteractive stop—SUSP control character generates this
            TTINBackground job attempted a read—process group is suspended
            TTOUBackground job attempted a write—process group is suspended
    
The default action for all the general process control signals is abnormal 
process termination. A process can choose to ignore all signals except the KILL 
signal. There is no way for you to tell what processes are ignoring what 
signals. But if you need to terminate a process, the KILL signal cannot be 
ignored and can be used as a last resort when attempting to terminate a process. 


The default action for the job control process control signals is suspending 
process execution, except for the CONT signal which defaults to resuming process 
execution. Once again, a process may choose to ignore most of these signals. The 
CONT signal cannot be ignored, so you can always continue a suspended process. 
The STOP signal will always suspend a process because it cannot be ignored. 

Except for KILL and STOP, a process may catch a signal. This means that it can 
accept the signal and do something other than the default action. For example, a 
process may choose to catch a TERM signal, do some special processing, and 
finally either terminate or continue as it wishes. Catching a signal allows the 
process to decide which action to take. If the process does not catch a signal 
and is not ignoring the signal, the default action results. 

Killing Processes 

At some time or other, you will run a command and subsequently find out that you 
need to terminate it. You may have entered the wrong command, you may have 
entered the right command but at the wrong time, or you may be stuck in a 
program and can't figure out how to exit. 

If you want to terminate your foreground process, the quickest thing to try is 
your interrupt control character. This is usually set to Ctrl+C, but make sure 
by looking at your stty -a output. The interrupt control character sends an INT 
signal to the process. It is possible for a program to ignore the INT signal, so 
this does not always terminate the process. A second alternative is to use your 
quit character (often Ctrl +\, set using stty quit char), which will send a QUIT 
signal. A process can ignore the QUIT signal. If your shell supports job control 
(C or Korn shells), you can suspend the process and then use the kill command. 
Once again, your process can ignore the suspend request. If you don't have job 
control or if none of these attempts work, you need to find another window, 
terminal, or screen where you can access your computer. From this other shell 
you can use the ps command along with the kill command to terminate the process. 
To terminate a process that is executing in the background, you can use the 
shell that is in the foreground on your terminal. 

The kill Command 

The kill command is not as nasty as it sounds. It is the way that you can send a 
signal to an executing process (see the section "Signaling a Process"). A common 
use of the kill command is to terminate a process, but it can also be used to 
suspend or continue a process. 

To send a signal to a process, you must either be the owner of the process (that 
is, it was started via one of your shells) or you must be logged in as root. 

See the section "Job Control and Process Groups" for information on how to use 
special features of the kill command for managing jobs. 

Finding What to Kill Using ps 

To send a signal to a process via the kill command, you need to somehow identify 
the particular process. Two commands can help you with this: the ps command and 
the jobs command. All UNIX systems support some version of the ps command, but 
the jobs command is found in job control shells only. (See the section "Job 
Control and Process Groups" for details on job control and the jobs command.) 

The ps command shows system process information for your computer. The processes 
listed can be owned by you or other users, depending on the options you specify 
on the ps command. Normally, if you want to terminate a process, you are the 
owner. It is possible for the superuser (root) to terminate any processes, but 
non-root users may only terminate their own processes. This helps secure a 
system from mistakes as well as from abuse. 

Terminating a process can be a three-step process: first you should check the 
list of processes with ps. See the section "Monitoring Processes" if you're not 
sure how to do this. The output of ps should contain the process identifier of 
each process. Make sure you look for the PID column and not the PPID column. The 
PPID is the process ID for the parent process. Terminating the parent process 
could cause many other processes to terminate as well. 

Second, you can send a signal to the process via the kill command. The kill 
command takes the PID as one argument; this identifies which process you want to 
terminate. The kill command also takes an optional argument, which is the signal 
you wish to send. The default signal (if you do not specify one) is the TERM 
signal. There are several signals that all attempt to terminate a process. 
Whichever one you choose, you may specify it by its name (for example, TERM) or 
by a number. The name is preferable because the signal names are standardized. 
The numbers may vary from system to system. To terminate a process with PID 
2345, you might try kill -HUP 2345. This sends the HUP signal to process 2345. 

Third, you should check the process list to see if the process terminated. 
Remember that processes can ignore most signals. If you specified a signal that 
the process ignored, the process will continue to execute. If this happens, try 
again with a different signal. 



TIP: If you have a CPU-intensive job running in the background and you want to 
get some work done without killing the job, try using kill -STOP PID. This will 
force the job to be suspended, freeing up CPU time for your more immediate 
tasks. When you are ready for the job to run again, try kill -CONT PID. 



Determining Which Signal to Send 

The sure way to make a process terminate is to send it the KILL signal. So why 
not just send this signal and be done with it? Well, the KILL signal is 
important as a last resort, but it is not a very clean way to cause process 
termination. A process cannot ignore or catch the KILL signal, so it has no 
chance to terminate gracefully. If a process is allowed to catch the incoming 
signal, it has an opportunity to do some cleaning up or other processing prior 
to termination. 

Try starting with the TERM signal. If your interrupt control character did not 
work, the INT signal probably won't either, but it is probably a reasonable 
thing to try next anyway. A common signal that many processes catch and then 
cleanly terminate is the HUP signal, so trying HUP next is a good idea. If you 
would like a core image of the process (for use with a debugging tool), the QUIT 
signal causes this to happen. If your process isn't exiting at this point, it 
might be nice to have the core image for the application developer to do 
debugging. If none of these signals caused the process to terminate, you can 
fall back on the KILL signal; the process cannot catch or ignore this signal. 



NOTE: If your process is hung up waiting for certain events (such as a network 
file server that is not responding), not even kill will have any visible effect 
immediately. As long as your process isn't using CPU time, you can probably stop 
worrying about it. The hung process will abort if the event ever occurs (for 
example, the file server responds or the request times out), but it might not go 
away until the next time you reboot. 



If you need a list of the available signals, the -l option to the kill command 
will display this list. You can also check the kill and signalf man pages for 
descriptions of each signal. The signals described in this section are the 
standard signals, but some systems may have additional supported signals. Always 
check the manual for your system to be sure. 

The dokill Script An Example 

Look at the dokill script as an example of how to kill a process reasonably and 
reliably: 

#!/bin/sh



# TERM, HUP and INT could possibly come in a different order



# TERM is first because it is what kill does by default



# INT is next since it is a typical way to let users quit a program



# HUP is next since many programs will make a recovery file



# QUIT is next since it can be caught and often generates a core dump



# KILL is the last resort since it can't be caught, blocked or ignored



for sig in TERM INT HUP QUIT KILL



do



        dosleep=0



        for pid in $*



        do



                # kill -0 checks if the process still exists



                if kill -0 $pid



                then



                        # Attempt to kill the process using the current signal



                        kill -$sig $pid



                        dosleep=1



                fi



        done



        # Here we sleep if we tried to kill anything.



        # This gives the process(es) a chance to gracefully exit



        # before dokill escalates to the next signal



        if [ $dosleep -eq 1 ]



        then



                sleep 1



        fi



done
This script uses the list of signals suggested in the section "Determining Which 
Signal to Send." For each signal in the suggested list, dokill sends the signal 
to any processes remaining in its list of processes to kill. After sending a 
signal, dokill sleeps for one second to give the other processes a chance to 
catch the signal and shut down cleanly. The last signal in the list is KILL and 
will shut down any process that is not blocked, waiting for a high-priority 
kernel event. If kill -KILL does not shut down your process, you may have a 
kernel problem. Check your system documentation and the WCHAN field of ps to 
find out which event blocked the process. 

Logging Out with Background Processes 

After you start using executing processes in the background, you may forget or 
lose track of what processes you have running. You can always check on your 
processes by using the ps command (see the section "Monitoring Processes"). 
Occasionally, you will try to exit from your shell when you have processes 
running in the background. By default, UNIX tries to terminate any background or 
stopped jobs you have when you log out. UNIX does this by sending a HUP signal 
to all of your child processes. 



NOTE: As a safeguard, job control shells (such as csh and ksh) issue a warning 
instead of allowing you to log out. The message will be similar to "You have 
stopped (running) jobs." If you immediately enter exit again, the shell will 
allow you to log out without warning. But, beware! The background processes are 
terminated immediately. If you don't want these background processes to be 
terminated, you must wait until they have completed before exiting. There is no 
way to log out while keeping the processes alive unless you plan ahead. 



Using nohup 

Some of the commands you use may take so long to complete that you may not be 
able to (or want to) stay logged in until they complete. To change this 
behavior, you can use the nohup command. The word nohup simply precedes your 
normal command on the command line. Using nohup runs the command, ignoring 
certain signals. This allows you to log out, leaving the process running. As you 
log out, all your existing processes (those processes with your terminal as the 
controlling terminal) are sent the HUP signal. Since the process on which nohup 
is used ignores this signal, you can log out and the process will not terminate. 
If you have a nohup process in the background as you attempt to log out, your 
shell may warn you on your first exit command and require an immediate second 
exit in order to actually log out. (If yours is a shell that does job control, 
such as ksh or csh, see the section "Job Control and Process Groups.") 



NOTE: There are several varieties of the nohup command. The SYSV nohup 
executable arranges for the command to ignore NOHUP and QUIT signals but does 
nothing regarding the TERM signal. If the output is going to standard out, it is 
redirected to the file nohup.out (or alternately to $HOME/nohup.out if you can't 
write to the first). 

The C shell has a built-in nohup command. It arranges for the command to ignore 
TERM signals. (In C shell, background commands automatically ignore the HUP 
signal.) It does not redirect output to the file nohup.out. 

Your system or shell may have a slight variation on the exact signals ignored 
and whether the nice value is changed when you use nohup. 



Prioritizing Processes 

Part of administering your processes is controlling how much CPU time they use 
and how important each process is relative to the others. UNIX supplies some 
fairly simple ways to monitor and control CPU usage of your process. This 
section describes how to use UNIX nice values to control your process CPU usage. 
By setting nice values for large jobs that aren't time critical, you can make 
your system more usable for other jobs that need to be done now. 

What Is a Priority? 

The UNIX kernel manages the scheduling of all processes on the system in an 
attempt to share the limited CPU resource fairly. Because UNIX has grown as a 
general purpose time-sharing system, the mechanism the scheduler uses tries to 
favor interactive processes over long-running, CPU-intensive processes so that 
users perceive good system response. UNIX always schedules the process that is 
ready to run (not waiting for I/O or an event) with the lowest numerical 
priority (that is, lower numbers are more important). If two processes with the 
same priority are ready, the scheduler will schedule the process that has been 
waiting the longest. If your process is CPU intensive, the kernel will 
automatically change your process priority based on how much CPU time your 
process is using. This gives preference to interactive applications that don't 
use lots of CPU time. 



NOTE: Low PRI means high priority. You may find it a bit confusing that lower 
numbers for priority mean "higher" priority. Try thinking of the scheduler 
starting out at priority zero and seeing if any processes at that priority are 
ready. If not, the scheduler tries priority 1, and so on. 



To see how the UNIX scheduler works, look at the example in Table 19.1. In this 
example, three processes are each running long computations, and no other 
processes are trying to run. Each of the three processes will execute for a time 
slice and then let one of the other processes execute. Note that each process 
gets an equal share of the CPU. If you run an interactive process, such as a ps, 
while these three processes are running, you will get priority to run. 

    Table 19.1. Scheduling three CPU-intensive processes. 
    
Process 1




            Process 2




            Process 3




            
            RunningWaitingWaiting
            WaitingRunningWaiting
            WaitingWaitingRunning
            RunningWaitingWaiting
            WaitingRunningWaiting
            WaitingWaitingRunning
    
Being Nice 

One of the factors the kernel uses in determining a process priority is the nice 
value, a user-controlled value that indicates how "nice" you want a process to 
be to other processes. Traditionally, nice values range from 0 to 39 and default 
to 20. Only root can lower a nice value. All other users can only make processes 
more nice than they were. 

To see how the UNIX scheduler works with nice, look at the example in Table 
19.2. In this example, three processes are each running long computations and no 
other processes are trying to run. This time, Process 1 was run with a nice 
value of 30. Each of the three processes will execute for a time slice and then 
let one of the other processes execute. However, in this case, Process 1 gets a 
smaller share of the CPU because the kernel uses the nice value in calculating 
the priority. Once again, if you run an interactive process, like a ps, while 
these three processes are running, you will get priority to run. 

    Table 19.2. Scheduling three CPU-intensive processes, one nicely. 
    
Process 1




            Process 2




            Process 3, Nice Process




            
            RunningWaitingWaiting
            WaitingRunningWaiting
            WaitingWaitingRunning
            RunningWaitingWaiting
            WaitingRunningWaiting
            RunningWaitingWaiting
            WaitingWaitingRunning
            WaitingRunningWaiting
            RunningWaitingWaiting
            WaitingRunningWaiting
    
Using renice on a Running Process 

BSD introduced the ability to change the nice value of other processes that are 
owned by you. The renice command gives you access to this capability. If you run 
a job and then decide it should be running with lower priority, you can use 
renice to do that. 



CAUTION: Not all systems have the renice command. Most systems based on BSD have 
it. Some systems, which are not based on BSD have added renice. The renice 
command on your system may take slightly different arguments than in the 
examples here. Check your system documentation to see if you have renice and 
what arguments it takes. 



On BSD-based systems, the renice command takes arguments in this manner: 

renice priority [ [-p] pid ... ] [ -g pgrp ... ] [ -u userid ... ]
The priority is the new nice value desired for the processes to be changed. The 
-p option (the default) allows a list of process identifiers; you should get 
these from ps or by saving the PID of each background task you start. The -g 
option allows a list of process groups; if you are using a shell that does job 
control you should get this from the PID of each background task you start or by 
using ps and using the PID of the process that has a PPID that is your shell's 
PID. The -u option outputs a list of user IDs; unless you have appropriate 
privileges (usually only if you are root), you will be able to change only your 
own processes. If you want to make all of your current processes nicer, you can 
use renice -u yourusername. Remember that this will affect your login shell! 
This means that any command you start after renice will have lower priority. 

Here is an example of using renice on a single process. You start a long job 
(called longjob) and then realize you have an important job (called impjob) to 
run. After you start impjob, you can do a ps to see that longjob is PID 27662. 
Then you run renice 20 27662 to make longjob have a lower priority. If you 
immediately run ps l (try ps -l on a SYSV system that has renice), you will see 
that longjob has a higher nice value (see the NI column). If you wait a bit and 
do another ps l, you should notice that impjob is getting more CPU time (see the 
TIME column). 

$ longjob &



27662



$ impjob &



28687



$ ps l



     F S UID   PID  PPID   C PRI NI ADDR  SZ  RSS   WCHAN    TTY  TIME CMD



240801 S 343 24076 29195   0  60 20 4231  88  268          pts/4  0:00 -sh 



240001 R 343 26398 24076   4  62 20 4e52 108  204          pts/4  0:00 ps l 



241001 R 343 27662 24076  52  86 20 49d0  32   40          pts/4  0:03 longjob 



241001 R 343 28687 24076  52  86 20 256b  32   40          pts/4  0:00 impjob 



$ renice 20 27662



27662: old priority 0, new priority 20



$ ps l



     F S UID   PID  PPID   C PRI NI ADDR  SZ  RSS   WCHAN    TTY  TIME CMD



240001 R 343 18017 24076   3  61 20 60b8 108  204          pts/4  0:00 ps l 



240801 S 343 24076 29195   0  60 20 4231  88  268          pts/4  0:00 -sh 



241001 R 343 27662 24076  32  96 40 49d0  32   40          pts/4  0:09 longjob 



241001 R 343 28687 24076  52  86 20 256b  32   40          pts/4  0:07 impjob 



$ # Wait a bit



$ ps l



     F S UID   PID  PPID   C PRI NI ADDR  SZ  RSS   WCHAN    TTY  TIME CMD



240801 S 343 24076 29195   0  60 20 4231  88  268          pts/4  0:00 -sh 



241001 R 343 27662 24076  74 117 40 49d0  32   40          pts/4  0:31 longjob 



241001 R 343 28687 24076 115 117 20 256b  32   40          pts/4  0:41 impjob 



240001 R 343 29821 24076   4  62 20 4ff2 108  204          pts/4  0:00 ps l 




Some jobs you run may start multiple processes, but renice -p will affect only 
one of them. One way to get around this is to use ps to find all of the 
processes and list each one to renice -p. If you are using a job control shell 
(for example, Korn shell or C shell), you may be able to use renice -g. In the 
following example, longjob spawns several sub-processes to help do more work 
(see the output of the first ps l). Notice that if you use renice -p you affect 
only the parent process's nice value (see the output of the second ps l). If you 
are using a shell that does job control, your background process should have 
been put in its own process group with a process group ID the same as its 
process ID. Try renice 20 -g PID and see if it works. Notice in the output of 
the third ps l that all of the children of longjob have had their nice values 
changed. 

$ longjob &



[1]     27823



$ ps l



     F S UID   PID  PPID   C PRI NI ADDR  SZ  RSS   WCHAN    TTY  TIME CMD



  1001 R 343 21938 27823  27  77 24 328e  56   20          pts/5  0:01 longjob 



  1001 R 343 26545 27823  26  77 24 601a  48   20          pts/5  0:01 longjob 



201001 R 343 27823 27973  26  77 24 1647  56   20          pts/5  0:01 longjob 



200801 S 343 27973 24078   0  60 20 6838 104  384          pts/5  0:00 -ksh 



  1001 R 343 28336 27823  26  77 24 7f1e  40   20          pts/5  0:01 longjob 



200001 R 343 29877 27973   4  62 20 4ff2 108  204          pts/5  0:00 ps l 



$ renice 20 -p 27823



27823: old priority 4, new priority 20



$ ps l



     F S UID   PID  PPID   C PRI NI ADDR  SZ  RSS   WCHAN    TTY  TIME CMD



  1001 R 343 21938 27823  24  76 24 328e  56   20          pts/5  0:04 longjob 



  1001 R 343 26545 27823  24  76 24 601a  48   20          pts/5  0:04 longjob 



201001 R 343 27823 27973  11  85 40 1647  56   20          pts/5  0:04 longjob 



200801 S 343 27973 24078   0  60 20 6838 104  384          pts/5  0:00 -ksh 



  1001 R 343 28336 27823  24  76 24 7f1e  40   20          pts/5  0:04 longjob 



200001 R 343 29699 27973   4  62 20 4ff2 108  204          pts/5  0:00 ps l 



$ renice 20 -g 27823



27823: old priority 4, new priority 20



$ ps l



     F S UID   PID  PPID   C PRI NI ADDR  SZ  RSS   WCHAN    TTY  TIME CMD



  1001 R 343 21938 27823  39  99 40 328e  56   20          pts/5  0:06 longjob 



  1001 R 343 26545 27823  38  99 40 601a  48   20          pts/5  0:06 longjob 



201001 R 343 27823 27973  38  99 40 1647  56   20          pts/5  0:05 longjob 



200801 S 343 27973 24078   0  60 20 6838 104  384          pts/5  0:00 -ksh 



  1001 R 343 28336 27823  38  99 40 7f1e  40   20          pts/5  0:06 longjob 



200001 R 343 29719 27973   4  62 20 705d 108  204          pts/5  0:00 ps l 




Job Control and Process Groups 

Job control is a BSD UNIX addition that is used by some shells. Both C shell and 
Korn shell support job control. In order to support job control, these shells 
use the concept of process groups. Each time you enter a command or pipeline 
from the command line, your shell creates a process group. The process group is 
simply the collection of all the processes that are executed as a result of that 
command. For simple commands, this could be a single process. For pipelines, the 
process group could contain many processes. Either way, the shell keeps track of 
the processes as one unit by identifying a process group ID. This ID will be the 
PID of one of the processes in the group. 

If you run a process group in the background or suspend its execution, it is 
referred to as a job. A small integer value, the job number, is associated with 
this process group. The shell prints out a message with these two identifiers at 
the time when you perform the background operation. A process group and a job 
are almost the same thing. The one distinction you might care about is that 
every command line results in a process group (and therefore a process group 
identifier); a job identifier is assigned only when a process group is suspended 
or put into the background. 

Given process groups and job IDs, the shells have added new commands that 
operate on the job (or process group) as a whole. Further, existing commands 
(such as kill) are modified to take advantage of this concept. The two shells (C 
shell and Korn shell) have very minor differences from one another, but for the 
most part the job control commands in each are the same. 

Using the jobs Command 

The jobs command will show you the list of all of your shell's jobs that are 
either suspended or executing in the background. The list of jobs will look 
similar to this: 

[1]   Stopped              vi mydoc.txt



[2] - Running              fin_analysis < fin_database > fin_report &



[3] + Stopped (tty output) summararize_log &
Each line corresponds to a single process group, and the integer at the start is 
its job number. You can use the job number as an argument to the kill command by 
prefixing the job number with a percent (%) sign. To send a signal to the 
process vi mydoc.txt, you could enter kill %1. Since you did not specify the 
signal you wanted to send to the process, the default signal, TERM, is sent. 
This notation is just a convenience for you since you can do the same thing via 
kill and the PID. The real power of job control comes with the ability to 
manipulate jobs between the foreground and the background. 

The shell also keeps the concept of current and previous jobs. On the output of 
the jobs command you will notice a + next to the current job and a - next to the 
previous job. If you have more than two jobs, the remaining jobs have no 
particular distinction. Again, this notation is mainly a convenience for you. In 
some job control commands, if you do not specify a job (or PID) number, the 
current job is taken by default. Keep in mind that your current job is different 
from your foreground process group. A job is either suspended or in the 
background. 

The following are various ways to reference a job: 

%nWhere n is the job number reported by jobs
            %+Your current job
            %%Your current job
            %-Your previous job
            %stringJob whose command line begins with string
            %?stringJob whose command line contains string
    
Putting Jobs in the Foreground 

After executing a process group in the background, you may decide for some 
reason that you would like it to execute in the foreground. With non-job control 
shells, after executing a command line in the background (via the & symbol), it 
stays in the background until it completes or is terminated (for example, if you 
send a terminate signal to it via kill). With a job control shell, the fg 
command will move the specified job into the foreground. The fg command will 
take either a job number preceded by a percent (%) sign or a PID as an argument. 
If neither is given, the current job is taken as the default. 

The result of the fg command is that the specified job executes as your 
foreground process. Remember that you can have only one foreground process at a 
time. To move the vi mydoc.txt job into the foreground, you could enter fg %1. 

Suspending Process Groups 

To suspend an executing process group, you need to send a suspend signal to the 
process. There are two ways to do this: (1) use the suspend control character on 
your foreground process, or (2) send a suspend signal via the kill command. 

The suspend control character, commonly Ctrl+Z, is used to send a suspend signal 
to the foreground process. Your shell may be configured with a different suspend 
control character, so be sure to find out your own configuration by running the 
stty -a command. (Refer to the section "Working on the System" for information 
on control characters.) After you have executed a command in the foreground, you 
simply press Ctrl+Z (or whatever your suspend control character is) to suspend 
the running process. The result is that the process is suspended from execution. 
When this happens, your shell prints a message giving the job number and process 
group ID for that job. You can subsequently use the fg or bg commands to 
manipulate this process. 

Putting Jobs in the Background 

The bg command puts the specified jobs into the background and resumes their 
execution. The common way to use this command is following a suspend control 
character. After a job is put in the background, it will continue executing 
until it completes (or attempts input or output from the terminal). You 
manipulate it via fg or kill. 

An example may help you see the power of these commands when used together: 

$ long_job\



^Z[1] + Stopped                  long_job



$ important_job 1



$ jobs



[1] + Stopped                  sleep 400



$ bg



[1]     long_job&



$ important_job 2



$ kill -STOP %1



[1] + Stopped (signal)         long_job



$ important_job 3



$ fg %1



long_job
If you don't have a long_job, try using sleep 100. If you don't have an 
important_job, try using echo. This example shows how you can use job control to 
move jobs between the foreground and background and suspend, then later resume, 
jobs that might be taking computer resources that you need. 

Using wait to Wait for Background Jobs 

The wait command built into most shells (including all the shells discussed in 
this book) will wait for completion of all background processes or a specific 
background process. Usually, wait is used in scripts, but occasionally you may 
want to use it interactively to wait for a particularly important background job 
or to pause until all of your current background jobs complete so you will not 
load the system with your next job. The command wait will wait for all 
background jobs. The command wait pid will wait for a particular PID. If you are 
using a job control shell, you can use a job identifier instead of a PID: 

$ job1 &



[1]     20233



$ job2 &



[2]     20234



$ job3 &



[3]     20235



$ job4 %



[4]     20237



$ wait %1



$ wait 20234



$ wait



[4] +  Done                    job4 &



[3] +  Done                    job3 &



$ jobs



$
Using csh notify to Learn About Changes Sooner 

Most interactive use of wait in csh can be replaced by notify. The notify 
command tells csh not to wait until issuing a new prompt before telling you 
about the completion of all or some background jobs. The command notify will 
tell csh to give asynchronous notification of job completion. The command notify 
jobid will tell csh to give asynchronous notification for a particular job. For 
example: 

% sleep 30 &



[1] 20237



% sleep 10 &



[2] 20238



% notify %2







[2]   Done                 sleep 10



jobs



[1]  +Running              sleep 30



%
When you do this example, don't type anything after hitting return to enter 
notify %2. The notification appears as soon as job 2 finishes. 

My System Is Slow—Performance Tuning 

UNIX offers several tools that can be useful in finding performance problem 
areas. This section covers using ps and sar to look for processes which are 
causing problems and system bottlenecks which need to be resolved. Your system 
may have more performance analysis tools; check your system documentation. 

Monitoring the System with ps 

If your system is having performance problems, you may want to terminate or 
suspend some of the large or CPU-intensive processes to let your system run more 
effectively. You can use ps to locate some of these processes. 



NOTE: Many UNIX systems have or can run a program called top, which displays the 
current heavy users of system CPU resources. 



On a SYSV system, you can use ps -fe or ps -le to look at all processes and 
examine the list to look for those processes which are using lots of CPU or 
memory. Try running ps twice in a row to look for processes with rapidly 
increasing TIME: 

$ ps -le



 F S   UID   PID  PPID  C PRI NI     ADDR     SZ    WCHAN TTY      TIME COMD



19 T     0     0     0 80   0 SY f808c4bc      0          ?        0:20 sched



 8 S     0     1     0241   1 20 fc1c2000     43 fc1c21c4 ?        0:02 init



19 S     0     2     0  1   0 SY fc13c800      0 f80897a0 ?        0:00 pageout



19 S     0     3     0 80   0 SY fc13c000      0 f8089e4e ?        0:06 fsflush



 8 S     0   204   120 35   1 20 fc311000    265 f808fb60 ?        0:00 in.rlogi



 8 S     0   179     1 29   1 20 fc3b2800    196 fc16554e ?        0:00 sac



 8 S     0   136     1 29   1 20 fc36d000    353 f808fb60 ?        0:00 automoun



 8 S     0   103     1 80   1 20 fc32e800    326 f808fb60 ?        0:01 rpcbind



 8 S     0   109     1 52   1 20 fc333800    294 f808fb60 ?        0:01 ypbind



 8 S     0   120     1154   1 20 fc349800    289 f808fb60 ?        0:01 inetd



 8 S     0   111     1 20   1 20 fc34b800    294 f808fb60 ?        0:00 kerbd



 8 S     0   105     1  3   1 20 fc335800    223 f808fb60 ?        0:00 keyserv



 8 S     0   123     1 80   1 20 fc348000    332 f808fb60 ?        0:19 statd



 8 S     0   125     1 65   1 20 fc353800    395 f808fb60 ?        0:01 lockd



 8 S     0   159   151 15   1 20 fc39d000    239 f808fb60 ?        0:00 lpNet



 8 S   343   151     1 61   1 20 fc399000    891 f808fb60 ?        0:00 bigproc



 8 S     0   143     1 18   1 20 fc30c000    259 fc308b4e ?        0:00 cron



 8 S     0   160     1 17   1 20 fc3a0800    329 fc22de4e ?        0:00 sendmail



 8 O   343   210   206  9   1 20 fc314000    114          pts/0    0:00 ps



 8 S     0   167     1 80   1 20 fc3b4800    310 f808fb60 ?        0:12 syslogd



 8 S     0   181     1 29   1 20 fc3b8800    213 f808fb60 console  0:00 ttymon



 8 S   343   206   204 80   1 20 fc30e800    125 fc314070 pts/0    0:00 sh



 8 S   343   208   204 80   1 20 fc30e800    212          pts/0    0:46 busyproc



 8 S     0   184   179 44   1 20 fc3b6800    208 f808fb60 ?        0:00 listen



 8 S     0   185   179 38   1 20 fc3b3000    221 fc3b31c4 ?        0:00 ttymon




Note that bigproc has a rather large value for SZ and that busyproc has a lot of 
TIME. 

On a BSD system, you can use ps xau to look at all processes and examine the 
%CPU and %MEM field for processes with high CPU and memory usage: 

% ps xau



USER       PID %CPU %MEM   SZ  RSS TT STAT START  TIME COMMAND



sartin    1014 88.7  0.9   32  192 p0 R    15:46   0:19 busyproc



root         1  0.0  0.0   52    0 ?  IW   Mar 12  0:00 /sbin/init -



root         2  0.0  0.0    0    0 ?  D    Mar 12  0:00 pagedaemon



root        93  0.0  0.0  100    0 ?  IW   Mar 12  0:00 /usr/lib/sendmail -bd -q



root        54  0.0  0.0   68    0 ?  IW   Mar 12  0:02 portmap



root       300  0.0  0.0   48    0 ?  IW   Mar 12  0:00 rpc.rquotad



root        59  0.0  0.0   40    0 ?  IW   Mar 12  0:00 keyserv



sartin     980  0.0  1.5  268  336 p0 S    15:33   0:00 -sh (tcsh)



root        74  0.0  0.0   16    0 ?  I    Mar 12  0:00  (biod)



root        85  0.0  0.0   60    0 ?  IW   Mar 12  0:00 syslogd



root       111  0.0  0.0   28    0 ?  I    Mar 12  0:00  (nfsd)



root       117  0.0  0.1   16   28 ?  S    Mar 12 17:03 /usr/bin/screenblank



root       127  0.0  0.0   12    8 ?  S    Mar 12 11:07 update



root       130  0.0  0.0   56    0 ?  IW   Mar 12  0:00 cron



root       122  0.0  3.3  740  748 ?  S    Mar 12  0:05 bigproc



root       136  0.0  0.0   56    0 ?  IW   Mar 12  0:00 inetd



sartin    1016  0.0  2.0  204  444 p0 R    15:46   0:00 ps xau



root       140  0.0  0.0   52    0 ?  IW   Mar 12  0:00 /usr/lib/lpd



root       834  0.0  0.2   44   44 ?  S    15:03   0:03 in.telnetd



root       146  0.0  0.0   40    0 co IW   Mar 12  0:00 - std.9600 console (gett



sartin     835  0.0  0.0   32    0 p0 IW   15:03   0:01 -ksh TERM=vt100 HOME=/ti



root      1011  0.0  0.9   24  204 ?  S    15:45   0:00 in.comsat



root         0  0.0  0.0    0    0 ?  D    Mar 12  0:01 swapper



%
Note that busyproc has 88.7 percent CPU usage and that bigproc has higher than 
average memory usage, but still only 3.3 percent. 

By using ps to examine the running processes, you can keep track of what is 
happening on your system and catch runaway processes or memory hogs. 

Monitoring the System with sar 

The sar command can be used to generate a System Activity Report covering things 
such as CPU usage, buffer activity, disk usage, TTY activity, system calls, 
swapping activity, file access calls, queue length, and system table and 
message/semaphore activity. If you run sar [-ubdycwaqvmA] [-o file] interval 
[num_samples], sar will print summaries a total of num_samples times every 
interval seconds and then stop. If num_samples is not supplied, sar will run 
until interrupted. With sar -o file the output will go in binary format to file 
and can be read using sar -f file. If you run sar [-ubdycwaqvmA] [-s time] [-s 
time] [-i sec] [-f file], the input will be read from a binary file (default is 
where the system command sa1 puts its output). 



NOTE: The sar command is the user interface to the System Activity Report. Your 
system administrator can configure your system to do continual activity 
reporting (using sa1 and other commands). See your system documentation on sar 
for more information. 




CAUTION: If you are on a BSD system, you may not have sar. Try checking out the 
vmstat and iostat commands for some similar information. 



The command sar -u 5 5 will print CPU usage statistics: 

$ sar -u 5 5



HP-UX cnidaria A.09.00 C 9000/837    03/14/94



16:18:53    %usr    %sys    %wio   %idle



16:18:58       0       0       0     100



16:19:03      58      28       1      13



16:19:08      84      16       0       0



16:19:13      57      11      31       0



16:19:18       0       6      94       0



Average       40      12      25      23



$
The column headings %usr, %sys, %wio, and %idle report the percentage of time 
spent respectively on user processes, system mode, waiting for I/O, and idling 
(doing nothing). The command sar -b will print buffer activity: 

$ sar -b 5 5



HP-UX cnidaria A.09.00 C 9000/837    03/14/94



16:19:34 bread/s lread/s %rcache bwrit/s lwrit/s %wcache pread/s pwrit/s



16:19:39       0       5      96       0       0       0       0       0



16:19:44       2    2809     100     174    2081      92       0       0



16:19:49       1    1456     100      83     950      91       0       0



16:19:54       4    1598     100      71    1267      94       0       0



16:19:59       3    1374     100      92    1055      91       0       0



Average        2    1449     100      84    1071      92       0       0



$
The bread/s and bwrit/s columns report transfers between the system buffers and 
disk (or other block) devices. The lread/s and lwrit/s columns report accesses 
of system buffers. The %rcache and %wcache columns report cache hit ratios. The 
UNIX kernel attempts to keep copies of buffers around in memory so that it can 
satisfy a disk read request without having to read the disk. For example, if one 
process writes block 5 of your disk and shortly after that another process 
writes different data to block 5, your system will save one write if it kept the 
data cached rather than writing to disk. High cache:hit ratios are good because 
they mean your system is able to avoid reading from or writing to the disk when 
it isn't necessary. The pread/s and pwrit/s columns report raw transfers. Raw 
transfers are transfers that don't use the file system at all. You will usually 
see raw transfers when using tar to read or write a tape or when using fsck to 
repair a file system. The command sar -d will print buffer activity for each 
block device (disk or tape drive): 

$ sar -d 5 2



HP-UX cnidaria A.09.00 C 9000/837    03/14/94



16:41:16  device   %busy   avque   r+w/s  blks/s  avwait  avserv



16:41:21 disc3-0        3     1.4       2      14     8.8    21.2



16:41:26 disc3-0       70   105.8      55     867  1328.6    12.7



Average  disc3-0       37   101.0      28     441  1291.5    12.9



$
The device column will report your system-specific disk name. The %busy and 
avque columns report the percentage of time the device was busy servicing 
requests and the average number of requests outstanding. The r+w/s and blks/s 
columns report the number of transfers per second and number of 512 byte blocks 
transferred per second. The avwait and avserv columns report the average time in 
milliseconds that transfer requests wait in the queue and the average time for a 
request to be serviced. The command sar -y will report TTY activity 

$ sar -y 10 4



HP-UX cnidaria A.09.00 C 9000/837    03/14/94



16:43:12 rawch/s canch/s outch/s rcvin/s xmtin/s mdmin/s



16:43:22     424     420     458       0       0       0



16:43:32     595     596    1469       0       0       0



16:43:42     678     674    1542       0       0       0



16:43:52     736     743     755       0       0       0



Average      608     608    1056       0       0       0




The rawch/s, canch/s, and outch/s columns report the input rate, input rate for 
characters with canonical processing, and output rate. The rcvin/s, xmtin/s, and 
mdmin/s columns report the modem receive rate, transmit rate, and interrupt 
rate. The command sar -c will report system call activity: 

$ sar -c 5 5



HP-UX cnidaria A.09.00 C 9000/837    03/14/94



16:50:33 scall/s  sread/s  swrit/s   fork/s   exec/s  rchar/s  wchar/s



16:50:38    1094       15     1016     0.60     0.60  16938189  1047142



16:50:43     592        8      540     0.20     0.20  9033318   590234



16:50:48     641        9      602     0.00     0.00  10007142   613376



16:50:53     735       14      766     0.20     0.20  11245978   507494



16:50:58     547       16      359     0.00     0.00  7215923   605594



Average      722       12      657     0.20     0.20  10887960   672768




The scall/s column reports the total number of system calls per second. The 
sread/s, swrit/s, fork/s, and exec/s columns report the number of read, write, 
fork, and exec system calls. The rchar/s, and wchar/s columns report the number 
of characters read and written by system calls. The command sar -w reports 
system-swapping activity: 

$ sar -w 5 5



HP-UX cnidaria A.09.00 C 9000/837    03/14/94



16:51:40 swpin/s bswin/s swpot/s bswot/s pswch/s



16:51:45    0.00     0.0    0.00     0.0      24



16:51:50    0.00     0.0    0.00     0.0      49



16:51:55    0.00     0.0    0.00     0.0       5



16:52:00    0.00     0.0    0.00     0.0      67



16:52:05    0.00     0.0    0.00     0.0      42



Average     0.00     0.0    0.00     0.0      37




The swpin/s, bswin/s, swpot/s, and bswot/s columns report the number of 
transfers and 512 byte blocks for swapins and swapouts. The pswch/s column 
reports the number of process context switches per second. The command sar -a 
reports system file access activity: 

$ sar -a 5 5



HP-UX cnidaria A.09.00 C 9000/837    03/14/94



16:52:31  iget/s namei/s dirbk/s



16:52:36       0       1       0



16:52:41      65      79       4



16:52:46     495     561      23



16:52:51     487     572      30



16:52:56     726     828      36



Average      354     408      18




The columns report the number of calls to the system function named. The command 
sar -q reports run queue activity: 

$ sar -q 5 5



HP-UX cnidaria A.09.00 C 9000/837    03/14/94



16:53:15 runq-sz %runocc swpq-sz %swpocc



16:53:20     1.0      80                



16:53:25     1.5      80                



16:53:30     2.0     100                



16:53:35     1.4     100                



16:53:40     1.6     100                



Average      1.5      92                




The runq-sz and %runocc columns report the average length of the run queue when 
occupied and the percentage of time it was occupied. The run queue is the list 
of processes that are ready to use the CPU (not waiting for I/O or other 
events). The swpq-sz and %swpocc columns report the average length of the swap 
queue when occupied and the percentage of time it was occupied. The swap queue 
is the list of processes that are ready to use the CPU, but are completely 
swapped out of memory and can't use the CPU until they are swapped into memory. 
This column may not appear (or may be empty or appear with 0 values) for systems 
without swapping. The command sar -v reports status of various system tables: 

$ sar -v



HP-UX cnidaria A.09.00 C 9000/837    03/14/94



13:12:54 text-sz  ov  proc-sz  ov  inod-sz  ov  file-sz  ov 



13:13:02   N/A   N/A  48/276   0  114/356   0  121/600   0



13:20:00   N/A   N/A  51/276   0  111/356   0  128/600   0



13:40:00   N/A   N/A  51/276   0   95/356   0  128/600   0



14:00:01   N/A   N/A  51/276   0  108/356   0  128/600   0



14:20:01   N/A   N/A  51/276   0   94/356   0  128/600   0



14:40:01   N/A   N/A  51/276   0   94/356   0  128/600   0



15:00:01   N/A   N/A  48/276   0  106/356   0  124/600   0



15:20:01   N/A   N/A  48/276   0   91/356   0  124/600   0



15:40:01   N/A   N/A  48/276   0   91/356   0  124/600   0



16:00:00   N/A   N/A  54/276   0  213/356   0  135/600   0



16:20:00   N/A   N/A  49/276   0  113/356   0  119/600   0



16:40:00   N/A   N/A  47/276   0   84/356   0  118/600   0



17:00:01   N/A   N/A  47/276   0   99/356   0  118/600   0




The column table-sz reports the entries/size of a particular system table. The 
tables for SYSV (from SVID3) are proc, inod, file, and lock. UNIX SVR4 (SVID3) 
includes a program synchronization mechanism using semaphores, which are 
critical resource controls. A process generally acquires a semaphore, performs a 
critical action, and releases the semaphore. No other process can acquire a 
semaphore already in use. The command sar -m reports message and semaphore 
activity: 

$ sar -m 6 5



HP-UX cnidaria A.09.00 C 9000/837    03/14/94



17:00:22   msg/s  sema/s



17:00:28    4.50    0.00



17:00:34    4.50    0.00



17:00:40    4.50    0.00



17:00:46    4.50    0.00



17:00:52    4.50    0.00



Average     4.50    0.00




The columns msg/s and sema/s report message and semaphore primitives per second. 


Summary 

In this chapter, you have learned how to use the UNIX commands ps, time, and sar 
to examine the state of your processes and your system. You have learned about 
foreground and background jobs and how to use the job control features of UNIX 
and your shell (csh or ksh) to control foreground and background jobs. You have 
learned to use the nice and renice commands to limit the CPU impact of your 
jobs. You have learned to use the kill command to suspend or terminate jobs that 
are using too much of the available system resources. Applying this knowledge to 
your daily use of UNIX will help you and your system be efficient at getting 
tasks completed. 

    

--

         隋末风云起,双龙走天下。
         尽数天下英豪,唯我独尊! 

※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: 202.120.5.209]
--
※ 修改:.fzx 于 Aug  1 12:22:45 修改本文.[FROM: heart.hit.edu.cn]
※ 转寄:.紫 丁 香 bbs.hit.edu.cn.[FROM: chen.hit.edu.cn]

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: jmm.bbs@bbs.hit.edu.]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:844.525毫秒