P1n*_*u1n 11 command-line bash time-command
我正在构建自己的android rom。为了构建它,我需要运行
mka -j8 bacon
Run Code Online (Sandbox Code Playgroud)
但是,我想测量构建它所花费的时间,所以我使用了
/usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" mka -j8 bacon
Run Code Online (Sandbox Code Playgroud)
这不会运行,因为它说
/usr/bin/time: cannot run mka: No such file or directory
Run Code Online (Sandbox Code Playgroud)
任何有关如何解决此问题的帮助,不胜感激!我正在运行 xubuntu。
编辑:
出于某种原因,使用 make 而不是 mka 确实有效,但是使用mka更好。
/usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" make -j8 bacon
Run Code Online (Sandbox Code Playgroud)
编辑 2: 来自cyanogenmod 网站
调用
$ source build/envsetup.sh
或$ . build/envsetup.sh
从您的 shell 运行构建目录中的 envsetup.sh 脚本。envsetup.sh 为构建环境添加了许多功能,下面列出了其中最重要的功能。
source build/evnsetup.sh
是我在执行时间之前运行的命令。evnsetup.sh 添加的功能之一是mka
,是否可以从time
命令中调用它?
编辑 3:mka 类型的输出
$ type mka
mka is a function
mka ()
{
case `uname -s` in
Darwin)
make -j `sysctl hw.ncpu|cut -d" " -f2` "$@"
;;
*)
schedtool -B -n 1 -e ionice -n 1 make -j$(cat /proc/cpuinfo | grep "^processor" | wc -l) "$@"
;;
esac
}
Run Code Online (Sandbox Code Playgroud)
Mal*_*ppa 11
问题是这mka
是由您的脚本导出的 bash 函数,而不是可执行文件(与 相对make
),因此/usr/bin/time
在查找可执行文件时找不到它。
有两种可能的解决方案。
首先,请注意 bash 内置函数time
和可执行文件之间存在差异/usr/bin/time
。这些是不同的命令,它们采用不同的参数并生成不同的输出:
$ time sleep 1
real 0m1.001s
user 0m0.000s
sys 0m0.001s
$ /usr/bin/time sleep 1
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 664maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
Run Code Online (Sandbox Code Playgroud)
键入help time
以获取有关 bash 内置time
. 键入man time
以获得可执行文件的帮助/usr/bin/time
。
第一个解决方案使用time
,而第二个解决方案使用/usr/bin/time
。
第一种解决方案:使用bash内置函数 time
bash 内置函数time
知道已声明的 bash 函数,您可以立即使用它来测量此类函数的时间。
$ foo() {
sleep 1;
echo "Hello World"
}
$ time foo
Hello World
real 0m1.002s
user 0m0.000s
sys 0m0.001s
Run Code Online (Sandbox Code Playgroud)
在您的情况下,以下命令应该有效:
$ time mka -j8 bacon
Run Code Online (Sandbox Code Playgroud)
这将是我的首选方式。但是,它可能无法准确生成您想要的输出。特别是,它不测量或打印 CPU 使用率。
第二种解决方案:使用可执行文件 /usr/bin/time
您不能使用/usr/bin/time
(据我所知)直接测量内置 bash 函数的时间,但您可以做的是测量/bin/bash
执行该 bash 函数的可执行文件的时间。这有点麻烦,当您启动一个额外的bash
. 但是当面对一个需要几分钟来计算的函数时,这种开销可能可以忽略不计,因此它可能仍然更适合您的需求。
为了能够/bin/bash
在 bash 函数上启动可执行文件,我们必须先导出该函数。
$ foo() {
sleep 1;
echo "Hello World"
}
$ export -f foo
$ echo foo | /usr/bin/time /bin/bash
Hello World
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 1476maxresident)k
0inputs+0outputs (0major+707minor)pagefaults 0swaps
Run Code Online (Sandbox Code Playgroud)
因此,在您的情况下,为了能够使用/usr/bin/time
和生成您想要的输出格式,您可以进行如下操作:
$ export -f mka
$ echo 'mka -j8 bacon' | /usr/bin/time -f "User\t%U\nSys\t%S\nReal\t%E\nCPU\t%P" /bin/bash
Run Code Online (Sandbox Code Playgroud)