
我有這個 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