【问题标题】:How to show process state (blocking, non-blocking) in Linux如何在 Linux 中显示进程状态(阻塞、非阻塞)
【发布时间】:2023-09-21 00:39:02
【问题描述】:

有没有一种方法可以查询 Linux 进程表中的进程状态,以便能够证明在执行查询时进程是正在运行还是被阻塞?我的目标是从进程或程序的“外部”执行此操作,因为我希望从操作系统进程的角度来理解这一点,但欢迎提出任何想法!

这里是python代码阻塞的过程:

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

这是一个非阻塞进程的python代码:

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

这是显示进程 ID 的“ps -ef”的输出:

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 /

在处理这些“ls”命令时,我想显示哪些进程正在阻塞以及其他进程处于哪些状态。这个问题旨在成为一个工具,用于在我学习多处理时了解状态python,所以虽然我相信 PID 14309 是阻塞的,而 PID 14442 是非阻塞的,尽管我可能错了。这就是为什么能够查看或测试所有显示的 PID 对我很有帮助的原因。

感谢尊敬的用户“ubuntu”及其对此的回应: Blocking and Non Blocking subprocess calls 用于提供入门代码。

本例中的操作系统是 Ubuntu,但任何 debian 或操作系统注释都会有所帮助。

【问题讨论】:

    标签: python linux process blocking nonblocking


    【解决方案1】:

    使用ps -elf 将向您输出进程状态。 在 Centos 6.5 中,第二列是进程状态:

    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]
    

    【讨论】:

      【解决方案2】:

      一个进程在短程序中被阻塞的最明显的关键是它存在于进程表中:

      这清楚地表明了我正在寻找的东西,特别强调了“等待”状态以及不存在非阻塞程序,该程序在子进程在线时终止了

      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 /
      

      请注意命令“python popen_nb.py”缺少 PID,因为它已经完成。但是,我打开的两个终端窗口都从驱动器上的 ls 喷出结果...

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

      【讨论】:

        【解决方案3】:

        试试ps -weo pid,stat,wchan:32,args。你会得到如下输出:

        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
        

        这就是 pid、状态标志(见下文)、进程当前被阻塞的位置和命令行。标志是:

               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
        

        【讨论】:

        • 太棒了,这表明我在寻找什么。我在下面添加了另一部分,因为我相信它有助于理解。
        【解决方案4】:

        这可能不是您要查找的内容,但您可以尝试ps aux,它将为您提供 STAT 列。这不会明确表示阻塞或非阻塞,但某些状态会为您提供有关当前进程状态的更多信息。例如是否正在运行或处于僵尸状态(即将被回收)。

        【讨论】: