【问题标题】:hijacking terminal stdin from python从python劫持终端标准输入
【发布时间】:2017-06-17 09:52:25
【问题描述】:

在 python 中有没有办法劫持终端标准输入?仅 Unix 的解决方案就可以了。

我目前正在围绕top 编写一个小包装器,因为我希望能够监控命名进程,例如所有正在运行的 python 实例。基本上我调用pgrep 来获取进程ID,然后使用-p 选项运行top

总的来说,这个脚本已经运行了好几年了(注意top -p 只接受 20 个 pid...)。但是,如果出现与名称模式匹配的新进程,我现在想调整脚本以更新对 top 的调用。这也工作得比较好,但是...在top 中以交互方式设置的任何选项都会在我每次更新pid 列表时丢失,但自然原因是我停止并重新启动top。因此,我想以某种方式劫持终端标准输入,以便能够回溯设置的影响,以便我可以在更新 pid 列表后相应地设置它们,甚至在必要时停止更新(例如,如果 top 正在等待来自的更多指令用户)。

现在也许我想要实现的只是愚蠢的,有更好的方法来做到这一点,如果是这样,我会非常感谢启蒙

(哦。标签ps 被用作标签top 不存在,我要在这里定义新标签,毕竟这两个实用程序都是相关的)

谢谢\p

【问题讨论】:

  • 我无法解析这个。你在说什么互动选项?我不确定您所说的“回溯”是什么意思。你想通过标准输入发送什么?也许张贴你在做什么的日志?查看 psutil pypi.python.org/pypi/psutil
  • 嗨罗伯特,也许你想阅读top 的手册页,这不是真的
  • 不是真的什么?我对顶很熟悉。我只是想读你的帖子,这很令人困惑。
  • 嗨罗伯特,我在写完之前意外地发送了回复。有关顶部的交互模式,请参阅手册页中的第 4 节。通过“回溯”,我的意思是“试图找出写入终端标准输入的最后一个字符”。我非常了解psutils,但我在这里的目的不是重建顶部,而是尝试添加一些功能,同时保持其正常功能。不知道你从哪里知道我正在尝试向标准输出写一些东西。但话又说回来,也许我的措辞很难消化,如果是这样道歉并希望以上澄清一些

标签: python linux terminal stdin ps


【解决方案1】:

你正在做的事情听起来有点像 hack。我会使用psutil 编写一个Python 脚本,它完全符合您的要求。无论您对什么信息感兴趣,psutil 都会提供给您 - 甚至更多。

又快又脏:

import psutil
import time    

while True:
    processes = [ p for p in psutil.process_iter() if 'python' in p.name() ]

    for p in processes:
        # print out whatever information interests you
        print(
                 p.pid, 
                 p.name(), 
                 p.cpu_percent(),
                 p.io_counters().read_bytes,
                 p.io_counters().write_bytes
                )
    time.sleep(10)

文档链接:http://pythonhosted.org/psutil/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 2015-06-09
    相关资源
    最近更新 更多