【问题标题】:Is there a way to retrieve process stats using Perl or Python?有没有办法使用 Perl 或 Python 检索进程统计信息?
【发布时间】:2010-10-21 14:40:39
【问题描述】:

有没有办法使用 Perl 或 Python 通用地检索进程统计信息?我们可以让它特定于 Linux。

有几个问题:我不会提前知道 PID,但我可以从脚本本身运行有问题的进程。例如,我这样做没有问题:

./myscript.pl some/process/I/want/to/get/stats/for

基本上,我至少想获得进程的内存消耗,但我可以获得的信息越多越好(如进程的运行时间、进程的平均 CPU 使用率等)。 )

谢谢。

【问题讨论】:

标签: python linux perl process


【解决方案1】:

看看Proc::ProcessTable 模块,它返回了相当多的系统进程信息。调用“fields”方法获取可以从每个流程中提取的详细信息列表。

我最近发现了上面的模块,它几乎取代了我在为 Linux 编写 Perl kill 程序时编写的 Process 模块。你可以看看我的脚本here

它可以很容易地扩展以从 ps 命令中提取更多信息。例如。 'getbycmd' 方法返回一个 pid 的列表,其命令行调用与传递的参数匹配。然后,您可以通过调用 'getdetail' 来检索特定进程的详细信息,方法是像这样将 PID 传递给它,

my $psTable = Process->new();

# Get list of process owned by 'root'
for my $pid ( $psTable->getbyuser("root") ) {

    $psDetail = $psList->getdetail( $pid );
    # Do something with the psDetail..

}

【讨论】:

    【解决方案2】:

    如果你fork()这个孩子,你就会知道它是 PID。

    然后,您可以在父进程中解析 /proc/<PID/ 中的文件以检查内存和 CPU 使用情况,尽管仅在子进程运行期间。

    【讨论】:

      【解决方案3】:

      一个常见的误解是阅读 /proc 就像阅读 /home。 /proc 旨在通过一个 open() 为您提供与填充某些结构的 20 个类似系统调用可以提供的相同信息。读取它不会污染缓冲区、将无辜程序发送到寻呼地狱或以其他方式导致小猫死亡。

      访问 /proc/foo 只是告诉内核“给我关于 foo 的信息,我可以以与语言无关的方式处理”

      如果您需要有关 /proc/{pid}/ 中内容的更多详细信息,请更新您的问题,我会发布它们。

      【讨论】:

      • 我在阅读 proc/{pid}/ 时没有问题。但是一旦子进程终止, proc/{pid}/ 就消失了,不是吗?我怎样才能确保它在我完成之前一直存在?
      • 我想我记得持有 /proc/pid/ 目录的打开文件句柄可以防止它消失,但我不确定。如果您是父母,只要您不收获孩子,/proc/pid/ 目录肯定会保留(自定义 $SIG{CHLD})。
      猜你喜欢
      • 1970-01-01
      • 2017-06-20
      • 2019-12-16
      • 1970-01-01
      • 2012-06-27
      • 2019-08-12
      • 2021-11-11
      • 1970-01-01
      • 2021-01-12
      相关资源
      最近更新 更多