我有这个 cronjob 每分钟运行一次
*/1 * * * * root sh /test.sh
我的 /test.sh 记录“top”和“free”命令的结果。当我使用“sh /teste.sh”在终端上手动运行它并将输出保存到一个漂亮的文件时,它工作得很好,但是当 cron 作业运行时,它只保存下面命令“free”的结果。请检查一下:
printf "\n" >> "log_lojar_top_free.txt"
printf %s "$(date)" >> "log_lojar_top_free.txt"
printf '\t' >> "log_lojar_top_free.txt"
top -b -n 3 -d 1 | grep "Cpu" | tail -n 1 | awk '/^%Cpu\(s\)/ {printf $2}' >> "log_lojar_top_free.txt"
printf '\t' >> "log_lojar_top_free.txt"
free | awk '/^Mem:/ {printf $7}' >> "log_lojar_top_free.txt"
导致只有最后一行(空闲)的输出被记录的错误是什么?
答案1
正如其他人所建议的,尝试在脚本中直接使用 bash shebang 或使用前缀bash
而不是sh
.因为我不知道你实际运行的系统是什么,我最近/bin/sh -c myscript.sh
在 ubuntu 下调用脚本 usign 时遇到了麻烦,ubuntu 是一个 debian 衍生版本,它使用dash
而不是bash
.
也许这就是你问题的关键。
编辑:我已经让它与这个 crontab 条目一起工作,以 root 身份完成crontab -e
:
*/1 * * * * /bin/bash -c "/test.sh"
答案2
这个版本适合我。但是,由于您自己的脚本也可以在这里使用,所以我不完全确定这会解决您的问题。
系统范围的 crontab 条目(root
如果这是 root 自己的 crontab,请省略该字段,通过 访问crontab -e
):
* * * * * root /root/test.sh
据我所知,您的脚本进行第三次迭代top
并收集 CPU 用户模式百分比。它还从 收集缓存的内存值free
。在这里,我放弃了free
并从 的第三次迭代中提取了相同的值top
。将此脚本复制到 /root/test.sh (并使其可执行):
#!/bin/bash
top -b -n 3 -d 1 |
awk -v date="$(date)" '
/^%Cpu/ {cpu=$2}
/cached Mem/ {cached=$9}
END {printf "\n%s\t%s\t%s", date, cpu, cached}
' >> /root/log_lojar_top_free.txt
使脚本可执行:
chmod +x /root/test.sh