所以我有一个 crontab 有这一行:
30 16 * * * (time sysbench --test=cpu --cpu-max-prime=20000 run) 2>> ~/cpu.out
我使用它是因为时间输出默认为 stderr 并且我想将其重定向到文件
当我在终端中运行命令时,它确实会写入我需要的输出:
real X.XXXs
user X.XXXs
sys X.XXXs
但是当我使用 cron 运行时,它会将以下内容写入文件:
39.69 user 0.92 system 0:40.67elapsed 99%CPU (0avgtext+0avgdata 1400maxresident)k0inputs+1outputs (0major+450minor) pagefaults 0swaps
有人能帮我吗?
PS:在手册页中有 -o 选项,但它不起作用,如果我尝试这样做,我会收到错误
答案1
当您在 shell 中运行它时,您实际上正在使用 bash 内置函数,如下所示:
anthony@Zia:~$ time perl -e 'sleep 1'
real 0m1.003s
user 0m0.000s
sys 0m0.004s
Cron 不使用内置的 bash;它正在使用/usr/bin/time
:
anthony@Zia:~$ /usr/bin/time perl -e 'sleep 1'
0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 1800maxresident)k
0inputs+0outputs (0major+514minor)pagefaults 0swaps
第二个实际上包含 bash 内置的所有信息,以及更多信息。它将“真实”标记为“已过去”。 (这也是该-o
选项不起作用的原因;这是 的选项/usr/bin/time
,而不是 bash 内置的选项)。
如果您需要使用内置的 bash,可以尝试以下两件事:
- 放在
SHELL=/bin/bash
crontab 的顶部。 - 更改您的命令以显式调用
bash -c "your command here"
.