【问题标题】:Is there a way to determine if a Linux PID is paused or not?有没有办法确定 Linux PID 是否暂停?
【发布时间】:2011-08-26 16:17:20
【问题描述】:

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

【问题讨论】:

    标签: python linux process controls pid


    【解决方案1】:

    您可以从 /proc 目录 (/proc/<PID>) 中找到有关进程的信息。具体来说,你可以通过这个 python 表达式找到它的运行状态:

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

    编辑:下一个表达式修复了原始的一个(可能很少见的)错误:

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

    【讨论】:

    • 不使用 os.path.join!...等等,这是纯 linux 问题。
    【解决方案2】:

    调用 ps 并检查 STAT 值。 D 不间断睡眠(通常是 IO) R 正在运行或可运行(在运行队列上) S 可中断睡眠(等待事件完成) T 由于作业控制信号或正在跟踪而停止。 W 分页(自 2.6.xx 内核起无效) X 死了(永远不应该被看到) Z 已失效(“僵尸”)进程,已终止但未被其父进程收割。

    【讨论】:

    • 谢谢,我使用了 ps axo fname,stat,pid 和你说的一样,我不知道 STAT 值是为了那个。
    【解决方案3】:

    你可以使用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'
    >>>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 2012-02-09
      • 2018-09-06
      相关资源
      最近更新 更多