如何在 Linux 中显示进程状态(阻塞、非阻塞)
How to show process state (blocking, non-blocking) in Linux
有没有办法查询 Linux 进程 table 中进程的状态,以便能够证明进程是 运行 还是在查询时被阻塞执行?我的目标是从 'outside' 过程或程序开始,因为我希望从 OS 过程的角度理解这一点,但欢迎任何想法!
这里是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
用于提供入门代码。
本例中的 OS 是 Ubuntu,但任何 debian 或 OS 评论都会有所帮助。
这可能不是您要查找的内容,但您可以尝试 ps aux
,这将为您提供 STAT 列。这不会明确说明阻塞或非阻塞,但某些状态会为您提供有关当前进程状态的更多信息。例如是运行还是处于僵尸状态(即将被回收)
尝试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
一个进程在短程序中被阻塞最明显的关键是它存在于进程中 table:
这清楚地表明了我正在寻找的东西,特别强调了 'wait' 状态和程序的不存在,该程序是非阻塞的,在子进程在线时已经终止
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,因为它已经完成。然而,我打开的两个终端 windows 都从我的驱动器上的 ls 喷出结果...
non-blocking:
PID STAT WCHAN COMMAND
18869 S wait /bin/sh -c ls -lRa /
18870 D vfs_readdir ls -lRa /
使用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]
有没有办法查询 Linux 进程 table 中进程的状态,以便能够证明进程是 运行 还是在查询时被阻塞执行?我的目标是从 'outside' 过程或程序开始,因为我希望从 OS 过程的角度理解这一点,但欢迎任何想法!
这里是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 用于提供入门代码。
本例中的 OS 是 Ubuntu,但任何 debian 或 OS 评论都会有所帮助。
这可能不是您要查找的内容,但您可以尝试 ps aux
,这将为您提供 STAT 列。这不会明确说明阻塞或非阻塞,但某些状态会为您提供有关当前进程状态的更多信息。例如是运行还是处于僵尸状态(即将被回收)
尝试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
一个进程在短程序中被阻塞最明显的关键是它存在于进程中 table:
这清楚地表明了我正在寻找的东西,特别强调了 'wait' 状态和程序的不存在,该程序是非阻塞的,在子进程在线时已经终止
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,因为它已经完成。然而,我打开的两个终端 windows 都从我的驱动器上的 ls 喷出结果...
non-blocking:
PID STAT WCHAN COMMAND
18869 S wait /bin/sh -c ls -lRa /
18870 D vfs_readdir ls -lRa /
使用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]