pythonlinuxprocessblockingnonblocking

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.


Solution

  • 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