crontabを介してbashスクリプトが期待どおりに動作しません。

crontabを介してbashスクリプトが期待どおりに動作しません。

私が作業しているレガシーシステムとは何かsun Solaris 10、特定のプロデューサーを処理するスクリプトを作成しました。bash/perl/posix/sqlplus/awk約1,000本のラインで構成されており、スタンドアロンモードではうまく動作し、期待どおりに動作しますが、問題があります。スクリプトが機能しません。 crontabの役割は、StackOverflow/stackunixexchangeを通じて次のような多くのアドバイスに従いました。

  1. 体房から出発#!/bin/bash
  2. フル権限のスクリプト777
  3. 正しいcrontab時間構文
  4. サービスが再起動されました
  5. シェルの上部にすべての環境変数をロードする
  6. 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

関連情報