私が作業しているレガシーシステムとは何かsun Solaris 10
、特定のプロデューサーを処理するスクリプトを作成しました。bash/perl/posix/sqlplus/awk
約1,000本のラインで構成されており、スタンドアロンモードではうまく動作し、期待どおりに動作しますが、問題があります。スクリプトが機能しません。 crontabの役割は、StackOverflow/stackunixexchangeを通じて次のような多くのアドバイスに従いました。
- 体房から出発
#!/bin/bash
- フル権限のスクリプト777
- 正しいcrontab時間構文
- サービスが再起動されました
- シェルの上部にすべての環境変数をロードする
- crontab bash のスクリプトの先頭に bash を設定します。
私の問題はそのスクリプトにのみあり、残りのスクリプトはうまく機能します。おそらく、スクリプトはbashになければならず、crontabはデフォルトで最小限の環境変数がロードされたshまたはcrontabで実行されるためです。
最後に、必要なシェルを別のシェルに挿入し、crontabで新しいシェルを設定し、新しいシェルを介して実行して問題を解決しました。このステップの後、crontabが正常に動作し、スクリプトを実行できることがわかりますが、問題のスクリプトが予期したタスクを実行せずにbash statements
プロデューサーif statements
などの他のタスクをスキップしていることです。sqlplus
/Perl statements
この問題を解決する方法を教えてください。この問題は、crontabでスクリプトをスケジュールしたときにのみ発生します。
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