在 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

相關內容