如何确定Linux进程ID(PID)是否暂停?
我有一个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'