Crontab スクリプトが Ubuntu で機能しないのはなぜですか?


クローン

多くの場合、crontab スクリプトはスケジュールどおりに、または期待どおりに実行されません.これには多くの理由があります.
  • 間違った crontab 表記
  • 権限の問題
  • 環境変数

  • このコミュニティ wiki は、crontab 個のスクリプトが期待どおりに実行されない主な理由を集約することを目的としています.それぞれの理由を個別の回答に記入してください.

    回答ごとに 1 つの理由 (実行されない理由の詳細) と、その 1 つの理由に対する修正を含めてください.

    cron 固有の問題のみを記述してください.シェルからは期待どおりに実行されるが、cron によって誤って実行されるコマンド.

    受け入れられた回答



    異なる環境

    Cron は、最小限の環境変数セットをジョブに渡します.違いを確認するには、次のようなダミー ジョブを追加します.

    * * * * * env > /tmp/env.output
    

    /tmp/env.output が作成されるのを待ってから、ジョブを再度削除します. /tmp/env.output の内容を、通常の端末で実行された env の出力と比較します.

    ここでよくある「落とし穴」は、PATH 環境変数が異なることです. somecommand/opt/someApp/bin に追加した PATH にあるコマンド /etc/environment を cron スクリプトで使用しているのではないでしょうか? cron はそのファイルから PATH を無視するため、スクリプトから somecommand を実行すると、cron で実行すると失敗しますが、ターミナルで実行すると機能します. /etc/environment からの変数が cron ジョブに渡されることは注目に値しますが、 PATH のように cron が特に設定する変数ではありません.

    これを回避するには、スクリプトの先頭に独自の PATH 変数を設定するだけです.例えば.

    #!/bin/bash
    PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    
    # rest of script follows
    
    


    代わりに、すべてのコマンドへの絶対パスを使用することを好む人もいます.私はそれに対してお勧めします.スクリプトを別のシステムで実行したい場合にどうなるかを考えてみてください.そのシステムでは、代わりにコマンドが /opt/someAppv2.2/bin にあります.スクリプトの最初の行を少し編集するだけでなく、/opt/someApp/bin/opt/someAppv2.2/bin に置き換えて、スクリプト全体を実行する必要があります.

    crontab ファイルに PATH 変数を設定することもできます.これはすべての cron ジョブに適用されます.例えば.

    PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    
    15 1 * * * backupscript --incremental /home /root
    
    


    投稿 Why Crontab Scripts Are Not Working in Ubuntu?Stack All Flow に最初に表示されました.