When your system is sluggish, you will want to see what users are on the system along with the processes they're running. To get a brief snapshot of this information, the tersely named w can show you who is logged in, from where, how long they've been idle, and what programs they're running. For instance, when I run w on my Red Hat box at home, I get this result:
3:58pm up 38 days, 4:37, 6 users, load average: 0.00, 0.07, 0.07 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT jjohn tty2 - 13Feb02 7:03m 1.32s 0.02s /bin/sh /usr/X jjohn pts/1 :0 8:55am 7:02m 0.06s 0.06s bash jjohn pts/3 :0 8:55am 0.00s 51.01s 0.05s w jjohn pts/0 :0 8:55am 7:02m 0.06s 0.06s bash jjohn pts/4 :0 8:55am 2:25m 2:01 0.12s bash jjohn pts/2 mp3.daisypark.ne Tue 4pm 3:41m 0.23s 0.23s -bash
Originally, I logged in at the console and started X. Most of the sessions are xterminals except for the last, which is an ssh session. The JCPU field accounts for the CPU time used by all the processes at that TTY. The PCPU simply accounts for the process named in the WHAT field. This is a quick and simple command to show you the state of your system, and it relies on no special process accounting from the kernel.
When you're debugging a problem with a program, trying to figure out why your CPU usage bill is so high [in the days when CPU cycles were rented -- JJ], or curious what commands someone (including yourself) is running, the lastcomm command on Berkeley-like Unixes can help (if your computer has its process accounting system running, that is). Here's an example that lists the user lesleys:
% date Mon Sep 4 16:38:13 EDT 2001 % lastcomm lesleys emacs lesleys ttyp1 1.41 secs Wed Sep 4 16:28 cat X lesleys ttyp1 0.06 secs Wed Sep 4 16:37 stty lesleys ttypa 0.02 secs Wed Sep 4 16:36 tset lesleys ttypa 0.12 secs Wed Sep 4 16:36 sed lesleys ttypa 0.02 secs Wed Sep 4 16:36 hostname lesleys ttypa 0.00 secs Wed Sep 4 16:36 quota lesleys ttypa 0.16 secs Wed Sep 4 16:35 ...
The processes are listed in the order completed, most recent first. The emacs process on the tty (Section 2.7) ttyp1 started 10 minutes ago and took 1.41 seconds of CPU time. Sometime while emacs was on ttyp1, lesleys ran cat and killed it (the X shows that). Because emacs ran on the same terminal as cat but finished later, Lesley might have emacs (with CTRL-z) stopped (Section 23.3) to run cat. The processes on ttypa are the ones run from her .cshrc and .login files (though you can't tell that from lastcomm). You don't see the login shell for ttypa (csh) here because it hasn't terminated yet; it will be listed after Lesley logs out of ttypa.
lastcomm can do more. See its manual page.
Here's a hint: on a busy system with lots of users and commands being logged, lastcomm is pretty slow. If you pipe the output or redirect it into a file, like this:
tee Section 43.8
% lastcomm lesleys > lesley.cmds & % cat lesley.cmds ...nothing... % lastcomm lesleys | tee lesley.cmds ...nothing...
the lastcomm output may be written to the file or pipe in big chunks instead of line-by-line. That can make it look as if nothing's happening. If you can tie up a terminal while lastcomm runs, there are two workarounds. If you're using a window system or terminal emulator with a "log to file" command, use it while lastcomm runs. Otherwise, to copy the output to a file, start script (Section 37.7) and then run lastcomm:
% script lesley.cmds Script started, file is lesley.cmds % lastcomm lesleys emacs lesleys ttyp1 1.41 secs Wed Sep 4 16:28 cat X lesleys ttyp1 0.06 secs Wed Sep 4 16:37 ... % exit Script done, file is lesley.cmds %
A final word: lastcomm can't give information on commands that are built into the shell (Section 1.9). Those commands are counted as part of the shell's execution time; they'll be in an entry for csh, sh, etc. after the shell terminates.
--JP and JJ
Copyright © 2003 O'Reilly & Associates. All rights reserved.