如何确定Linux进程ID(PID)是否暂停?

7 投票
3 回答
2559 浏览
提问于 2025-04-16 17:45

我有一个Python脚本,它使用SIGSTOP和SIGCONT命令配合os.kill来暂停或恢复一个进程。有没有办法判断相关的进程ID(PID)是处于暂停状态还是恢复状态呢?

3 个回答

2

你可以使用 psutil 这个工具:

>>> import psutil
>>> pid = 1243
>>> p = psutil.Process(pid)
>>> p.status
0
>>> str(p.status)
'running'
>>> p.status == psutil.STATUS_RUNNING
True
>>>
>>> p.suspend()
>>> p.status
3
>>> str(p.status)
'stopped'
>>> p.status == psutil.STATUS_STOPPED
True
>>>
>>> p.resume()
>>> str(p.status)
'running'
>>>
4

调用 ps 命令来查看 STAT 值。

D 不可中断的睡眠状态(通常是等待输入输出)

R 正在运行或可以运行(在运行队列中)

S 可中断的睡眠状态(在等待某个事件完成)

T 停止状态,可能是因为接收到作业控制信号,或者正在被调试。

W 交换(在 2.6.xx 内核中不再有效)

X 死亡状态(应该永远不会出现)

Z 僵尸进程(已经结束,但父进程还没有处理它)

4

你可以通过查看一个进程的 /proc 目录来获取关于它的信息,路径是 /proc/<PID>,其中 <PID> 是进程的编号。具体来说,你可以用下面这个 Python 表达式来查看它的运行状态:

open(os.path.join('/proc', str(pid), 'stat')).readline().split()[2]=='T'

补充说明:下面这个表达式修复了原始表达式中的一个(可能比较少见的)bug:

re.sub(r'\(.*\)', '()', open(os.path.join('/proc', str(pid), 'stat')).readline()).split()[2]=='T'

撰写回答