web-dev-qa-db-ja.com

cronjob内でbashを実行する

私は毎分実行するこのcronjobを持っています

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

/test.shは、「top」および「free」コマンドの結果をログに記録します。 「sh /teste.sh」を使用してターミナルで手動で実行すると正常に動作し、出力をNiceファイルに保存しますが、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"

最後の行(無料)だけで出力がログに記録される原因となっているエラーは何ですか?

3
Samul

他の人が示唆しているように、bashの代わりにshを使用して、スクリプトまたはプレフィックスでbash Shebangを直接使用するようにしてください。実際に実行しているシステムがわからないため、最近、スクリプトを使用して/bin/sh -c myscript.sh ubuntuの下では、dashの代わりにbashを使用するdebian派生物です。

多分これがあなたの問題の鍵です。

編集:私はそれをこのcrontabエントリで動作させています、ルートとしてcrontab -e

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

このバージョンは私にとってはうまくいきます。ただし、独自のスクリプトもここで機能するため、これで問題が解決するかどうかは完全にはわかりません。

システム全体のcrontabエントリ(これがcrontab -eでアクセスされるルート自身のcrontabである場合は、rootフィールドを省略します):

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

私が判断できる限り、スクリプトはtopから3番目の反復を取り、CPUユーザーモードの割合を収集します。また、キャッシュされたメモリ値をfreeから収集します。ここでは、freeを省略して、topの3番目の反復から同じ値を抽出しました。このスクリプトを/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
0
roaima