The output of the
pscommand shows a letter for the process state (depending on the output format you've asked ps to use, it may or may not be shown).
An example ps output (with most lines snipped for brevity):
[davidp@supernova:~]$ ps u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND davidp 3995 0.0 0.4 3324 1956 pts/2 Ss Aug17 0:00 /bin/bash davidp 25049 0.0 0.8 7104 3908 pts/5 S+ Aug19 0:10 irssi davidp 26180 0.0 0.1 2656 908 pts/0 R+ 14:41 0:00 ps u
The 'STAT' column shows the state codes for each process.
The codes used are:
|D||Uninterruptible sleep (usually IO)|
|R||Running or runnable (on run queue)|
|S||Interruptible sleep (waiting for an event to complete)|
|T||Stopped, either by a job control signal or because it is being traced.|
|W||paging (not valid since the 2.6.xx kernel)|
|X||dead (should never be seen)|
|Z||Defunct (“zombie”) process, terminated but not reaped by its parent.|
For BSD formats and when the stat keyword is used, additional characters may be displayed:
|<||high-priority (not nice to other users)|
|N||low-priority (nice to other users)|
|L||has pages locked into memory (for real-time and custom IO)|
|s||is a session leader|
|l||is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)|
|+||is in the foreground process group|
D state occurs then the process is in uninterruptible sleep. This state is bad, because you can't do anything with the process in D state.
Fortunately, process normally remains in such state not for so long. But if you have a heap of D state processes then some logic in system is disrupt.
If that is happening, the very important thing is to determine where this unlucky sleep occurs. It is easy to do with ps command with l option. WCHAN column shows the name of the kernel function where the process is sleeping:
# ps axl | grep D F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND vass 13478 7.2 0.0 1732 624 pts/1 D+ 17:36 0:00 find ./