cronjob内でbashを実行する

cronjob内でbashを実行する

毎分実行するcronジョブがあります

*/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"

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

答え1

他の人の提案どおり、スクリプト内で bash シェバンを直接使用するか、bashの代わりにを使用してプレフィックスとして使用してください。実際に実行しているシステムがわからないため、最近、の代わりにを使用する Debian 派生の ubuntu で、 を使用してshスクリプトを呼び出す際に問題が発生しました。/bin/sh -c myscript.shdashbash

おそらくこれがあなたの問題の鍵でしょう。

編集: この crontab エントリで動作しました。root として次のように実行しましたcrontab -e:

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

答え2

このバージョンは私の環境では動作します。ただし、独自のスクリプトもここでは動作するため、これで問題が解決するかどうかは完全にはわかりません。

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

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

私が判断できる限りでは、スクリプトは の 3 番目の反復を取得しtop、CPU ユーザーモードのパーセンテージを収集します。また、 からキャッシュされたメモリ値も収集しますfree。ここでは、 の 3 番目の反復を省略し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

関連情報