在 cronjob 中运行 bash

在 cronjob 中运行 bash

我有这个 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

相关内容