私のスクリプトを実行しているcronjobに小さな問題があります。
スクリプトの外観は次のとおり、名前は次のとおりですcreate_report.sh
。
#!/bin/bash
cd /work/directory
/some/command.sh > reports/report_$(date -d "1 day ago" +%Y%m%d).txt
明らかに少し単純化されていますが、出力をファイルに書き込んだ後、そのファイルが電子メールに添付され、私に送信されます。
「手動で」実行すると正常に動作し、ファイルに内容があると報告されます。
その後、毎朝7時にスクリプトを実行し、スクリプトの出力をミュートするcrontab-generator.orgを使用してcronjobを作成しました。
0 7 * * * /path/to/script/create_report.sh >/dev/null 2>&1
cronjob このスクリプトを実行すると、レポートファイルが生成され、私に送信されますが空です。おそらく、この動作の解決策を直接見つけることができますが、これが起こるとは予想していませんでした。誰かがこのようなことがどのように起こるかを説明し、これらのことが起こる正しい方法を指摘できますか?
明確に言えば、出力には興味がありませんが、create_report.sh
生成されるレポートファイルには興味があります。
よろしくお願いします!
答え1
cronがcronジョブを実行すると(最終的に)bashを実行してスクリプトを実行しますが、そのbashインスタンスは非対話型でログインシェルではないため、設定ファイルは選択されません。1これら/some/command.sh
の設定ファイルを使用して変数を設定したりアクティビティを実行したりする場合は、次のことを行う必要があります。
- このファイルを明示的にインポートするまたは
- スクリプトを実行する前にBASH_ENVを正しいファイルに設定するか、
- シャバンラインで
-i
オプション(load)を設定する~/.bashrc
か、 - シャーバンラインの設定
-i
と--login
オプション(ロード、または最初のもの~/.bash_profile
)~/.bash_login
または~/.profile
- これらの変数を設定するか、次のアクティビティを実行します。
/some/command.sh
引用:
脚注:
- BASH_ENVを設定していない場合
答え2
2つの問題があります。
1.
/some/command.sh > reports/report_$(...).txt
ディレクトリへの絶対パスを提供します。reports
例:
/some/command.sh > /home/user/reports/report_$(...).txt
手動で動作するので、cronデーモンによって実行されたときにスクリプトが別のCWDで実行されるとします。
2.同じユーザーでこのcronjobを実行していますか?
そうでない場合は、このcronjobを実行している実際のユーザーに必要な権限(ディレクトリに書き込むなど)がすべてあることをreports
確認してください。
何も機能しない場合は、システムログ(例tail -f /var/log/syslog | grep CRON
:)を見て、出力(stdout)を作成してこれを実行できます。そしてstderr)をディスクに:
5 * * * * /path/to/script/create_report.sh >>/tmp/cronlog 2>&1