【问题标题】:A linux shell that tracks time on the CPU and memory usage一个跟踪 CPU 和内存使用时间的 linux shell
【发布时间】:2011-07-08 19:54:13
【问题描述】:

我正在尝试做的事情的简短摘要:

模拟一个shell程序,当用户在自己的进程中输入命令时执行命令,每个进程完成后,输出所有子进程和shell在CPU上花费的总时间,以及最大内存量使用了一个进程。

创建 shell 和执行命令不是问题,但在跟踪有关进程的统计数据时,我却陷入了困境。

为了跟踪 CPU 时间,我打算使用 time 系统调用并将用户的命令通过 shell 传递到 time 中,这样进程就可以完成运行,并且在执行结束时我会得到 time 的信息可供我使用。但是当谈到获取 shell(当前程序)在 CPU 上花费的时间时,我不完全确定该怎么做,因为我看到或遇到的每个时间实现都使用上述传递命令和参数转换为时间,而我不能用 shell 做到这一点。我目前唯一的想法是让 shell 也成为子进程,通过时间运行,当 shell 完成运行子进程时,重新启动 shell,从时间中提取信息,然后重新启动 shell。这看起来很圆,但我找不到任何系统调用来做我想做的事。

至于内存使用情况,我在考虑使用top然后将信息拉出来,但是iirc top只监控当前内存使用情况,而不是总量。我唯一能想到的另一件事就是进入 /proc// 并尝试从那里的某个地方提取信息。再一次,似乎很迂回。

任何朝着正确方向轻推都会很棒。所有这些都是在 C 中完成的,如果这有所作为的话。

【问题讨论】:

  • 您是否考虑过查看top 的来源以了解它是如何进行跟踪的?
  • strace -cltrace -c 应该会给你一个好主意

标签: c linux shell memory-management cpu-usage


【解决方案1】:

一种可能的方法是将每个用户命令作为一个单独的进程运行,并在进程完成时获取资源使用信息。好的,作为进程运行命令很容易(参见 fork() 和 exec* 系列)。资源使用情况(时间、内存等)如何?我建议看看 getrusage() 系统调用。

男人说:

getrusage() 函数应 提供所用资源的衡量标准 由 当前进程或其终止并等待的子进程 过程。如果值 who 参数是 RUSAGE_SELF,信息应为 返回大约 当前进程使用的资源。如果值 谁的论点 RUSAGE_CHILDREN,应返回有关已使用资源的信息 由 终止并等待当前进程的子进程。

让我们看看这个系统调用提供了哪些信息:

struct rusage {
    struct timeval ru_utime; /* user time used */
    struct timeval ru_stime; /* system time used */
    long   ru_maxrss;        /* maximum resident set size */
    long   ru_ixrss;         /* integral shared memory size */
    long   ru_idrss;         /* integral unshared data size */
    long   ru_isrss;         /* integral unshared stack size */
    long   ru_minflt;        /* page reclaims */
    long   ru_majflt;        /* page faults */
    long   ru_nswap;         /* swaps */
    long   ru_inblock;       /* block input operations */
    long   ru_oublock;       /* block output operations */
    long   ru_msgsnd;        /* messages sent */
    long   ru_msgrcv;        /* messages received */
    long   ru_nsignals;      /* signals received */
    long   ru_nvcsw;         /* voluntary context switches */
    long   ru_nivcsw;        /* involuntary context switches */
};

我认为这足以解决您的问题。

【讨论】:

  • 这帮了很多忙,但我还是有点卡住了。我检查了文档,但不知道如何从 ru_utime 中提取信息。我发现的所有文档都说 sys/time.h 定义了 timeval 结构,但即使在导入它之后,我也无法声明该类型的结构或访问它应该具有的成员。
  • Hm... 你应该包含 标题。它包括定义 timeval 结构的 bits/time.h。这个结构有 tv_sec 字段存储秒和 tv_usec 存储微秒。您可以使用 tv_sec 和 gmtime go get tm 结构,将秒转换为年、月、日等。
猜你喜欢
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
相关资源
最近更新 更多