apollon
apollon

Reputation: 105

How to show process state (blocking, non-blocking) in Linux

Is there a way to query the state of processes in a Linux process table to be able to demonstrate if a process is running or blocked at the time the query is executed? My goal is to do this from 'outside' the process or program, as I hope to understand this in terms of the OS process, but any thought are welcome!

Here is the python code blocked process:

import subprocess
proc = subprocess.call('ls -lRa /', shell=True)

Here is the python code for a non-blocked process:

import subprocess
proc = subprocess.Popen('ls -lRa /', shell=True)

Here is the output of the 'ps -ef' showing the process ids:

UID        PID  PPID  C STIME TTY          TIME CMD
user1    14308  4145  0 15:30 pts/2    00:00:00 python call_b.py
user1    14309 14308  0 15:30 pts/2    00:00:00 /bin/sh -c ls -lRa /
user1    14310 14309 15 15:30 pts/2    00:00:30 ls -lRa /
root     14313     2  0 15:31 ?        00:00:00 [kworker/2:0]
user1    14318  2476  0 15:32 pts/4    00:00:00 -bash
user1    14442     1  0 15:33 pts/4    00:00:00 /bin/sh -c ls -lRa /
user1    14443 14442  6 15:33 pts/4    00:00:01 ls -lRa /

While these 'ls' commands are processing, I'd like to show which processes are blocking and which states the others are in. The question is intended to be a tool going forward, for learning about states as I learn multiprocessing with python, so while I believe PID 14309 to be blocking and PID 14442 to be non-blocking, although I may have that wrong. That is why it would be helpful for me to be able to see or test this for all of the PIDs shown.

Thanks to the venerable user 'ubuntu' and their response to this: Blocking and Non Blocking subprocess calls for providing the starter code.

The OS in this case is Ubuntu, but any debian or OS comment would be helpful.

Upvotes: 7

Views: 15566

Answers (4)

apollon
apollon

Reputation: 105

The most telling key to a process being blocking in a short program is it's existence in the process table:

This clearly shows what I was seeking, particularly emphasized by the wait state and by the lack of existence of the program which was non-blocking which has terminated while the subprocesses live onl

blocking:
  PID STAT WCHAN                            COMMAND
18714 S+   wait                             python call_b.py       <=see blocking process
18715 S+   wait                             /bin/sh -c ls -lRa /
18716 D+   sleep_on_buffer                  ls -lRa /

notice the lack of a PID for the command python popen_nb.py as it's already finished. However both the terminal windows I have open are spewing results from an ls on my drive...

non-blocking:
  PID STAT WCHAN                            COMMAND
18869 S    wait                             /bin/sh -c ls -lRa /
18870 D    vfs_readdir                      ls -lRa /

Upvotes: 0

Honsen
Honsen

Reputation: 327

Use ps -elf will ouput the process state to you. In Centos 6.5 , the second column is process state:

F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root         1     0  0  80   0 -  4808 poll_s 09:50 ?        00:00:01 /sbin/init
1 S root         2     0  0  80   0 -     0 kthrea 09:50 ?        00:00:00 [kthreadd]
1 S root         3     2  0 -40   - -     0 migrat 09:50 ?        00:00:00 [migration/0]
1 S root         4     2  0  80   0 -     0 ksofti 09:50 ?        00:00:00 [ksoftirqd/0]
1 S root         5     2  0 -40   - -     0 cpu_st 09:50 ?        00:00:00 [migration/0]

Upvotes: 1

tdelaney
tdelaney

Reputation: 77407

Try ps -weo pid,stat,wchan:32,args. You'll get output like:

28325 S<l  poll_schedule_timeout            /usr/bin/pulseaudio --start --log-target=syslog
28328 Sl   poll_schedule_timeout            /usr/bin/krunner
28344 Sl   poll_schedule_timeout            /usr/bin/kmix -session 014f10adfdf000141320876500000291010026_1419380700_54458

Thats the pid, state flags (see below), where the process is currently blocked and the command line. Flags 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

       <    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

Upvotes: 10

wilkesybear
wilkesybear

Reputation: 528

This may not be exactly what you're looking for, but you can try ps aux, which will give you the STAT column. This won't explicitly say blocking or non-blocking, but certain states will provide you with more information about what the process state current is. e.g. whether it's running or is in zombie state (about to be reclaimed).

Upvotes: 0

Related Questions