私はレガシー システムで作業しておりsun Solaris 10
、特定のプロデューサーを処理するスクリプトを作成しました。これはbash/perl/posix/sqlplus/awk
約 1,000 行で構成されており、スタンドアロン モードでは正常に動作し、期待どおりに動作しますが、スクリプトが crontab で動作しないという問題がありました。StackOverflow/stackunixexchange を通じて次のような多くの提案に従いました。
- シバンから始める
#!/bin/bash
- 完全な権限を持つスクリプト 777
- 正しいcrontab時間構文
- サービスが再開されました
- シェルの上部にすべての環境変数をロードしました
- crontab bashのスクリプトの先頭にbashを設定します
私の問題はそのスクリプトだけで、残りのスクリプトは正常に動作します。おそらくスクリプトはbashで実行され、crontabはデフォルトでshまたはcrontab load minimal環境変数を使用して実行されるためです。
最後に、必要なシェルを別のシェルに挿入し、crontab で新しいシェルを設定して新しいシェルで実行することで問題を解決しました。この手順の後、crontab は正常に動作し、スクリプトを実行できますが、スクリプトが期待どおりに機能しないという問題があります。プロデューサー などの他のジョブがスキップされbash statements
ます。この問題を解決する方法を教えてください。この問題は、スクリプトを crontab にスケジュールした場合にのみ発生しました。if statements
sqlplus
Perl statements
crontab のシェルは次のようになります:
10 10,16 * * 1,4 bash /rate/u01/WORK/MP/ERROR/USAGE_REJECTIONS/HolderUsageShell.sh
スクリプトは以下のように始まります:
#!/bin/bash
#environment shell contains all environment variables, I have tried to run it with/without and I got the same thing
/rate/environment.sh >/dev/null
cd /rate/path/
CurrentHour=$(date +%I)
DAY_In_Word=$(date +%A)
if [[ "$DAY_In_Word" == "Monday" || "$DAY_In_Word" == "Thursday" ]] && [[ "$CurrentHour" == "10" ]]; then
.
.
.
答え1
サブシェルでは環境を変更できません。サブシェルが終了すると、変更は失われます。サブシェルは親の環境を変更できません。現在のシェルで環境を変更する必要があります。スクリプトに次の変更を加えます。
/rate/environment.sh >/dev/null
すべきである
. /rate/environment.sh >/dev/null