我有一个 bash 脚本,它调用各种其他脚本,其中一个脚本有一堆命令,可以在屏幕会话中启动脚本,如下所示:
screen -S $SESSION_NAME -p $f -X stuff "$CMD\n"
使用 /usr/bin/time -v 运行我的 top 脚本会捕获所有峰值内存使用情况吗?我想让这个脚本作为 cron 作业运行,但我需要知道在给计算机上的其他用户造成问题之前需要多少内存。
谢谢
答案1
是与否,GNU时代试图展示一切的总结/巅峰。
您可以使用一个小的 C 程序来检查,例如mal.c
:
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
long bytes;
void *buf;
bytes = atol(argv[1]) * 1024;
buf = malloc(bytes);
memset(buf, 0, bytes);
printf("");
return 0;
}
并看到:
$ gcc mal.c -o mal
$ /usr/bin/time -f "%M" sh -c "./mal 5000"
5452
$ /usr/bin/time -f "%M" sh -c "./mal 10000"
10452
$ /usr/bin/time -f "%M" sh -c "./mal 5000; ./mal 10000"
10452
但正如 getrusage(2) 手册页 (Linux) 中所述,这是任何单个子进程的最大 RSS,而不是进程树的瞬时累积 RSS,所有进程同时使用内存
换句话说,它没有总结并行或后台进程,如您所见:
$ /usr/bin/time -f "%M" sh -c "./mal 1000000 & ./mal 5000"
5452
这也意味着您需要time
在屏幕会话内部运行来测量 $CMD 而不仅仅是屏幕。
供参考与 shell 内置的区别在于,时间二进制文件不能直接总结管道或函数:
$ time /bin/sleep 1 | /bin/sleep 2
real 2.00
user 0.00
sys 0.00
$ /usr/bin/time -p /bin/sleep 1 | /bin/sleep 2
real 1.00
user 0.00
sys 0.00