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.shDebian派生バージョンであるubuntuでスクリプトを呼び出すのに問題がありました。をdash使用するバージョンですbash

たぶんそれが質問の中心であるかもしれません。

編集:このcrontabエントリを使用してrootを操作しましたcrontab -e

*/1 * * * * /bin/bash -c "/test.sh"

答え2

このバージョンは私にとって効果的です。しかし、ここでは独自のスクリプトを使用することもできるので、これが問題を解決できるかどうかはわかりません。

システム全体のcrontabエントリ(root経由でアクセスされるルート自体のcrontabの場合は、このフィールドを省略してくださいcrontab -e):

* * * * * root /root/test.sh

私が知る限り、あなたのスクリプトは3回目の繰り返しを行い、topCPUユーザーモードの割合を収集します。キャッシュされたメモリ値も収集しますfree。ここでは、freeの3回目の繰り返しで同じ値を放棄して抽出しました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

関連情報