問題
cron サービスを使用してスクリプトを実行すると、シェルからは正常に実行されますが、crontab から実行すると同じ動作を示しません。
根本原因
crontab ジョブが正しく実行されない最も一般的な原因の 1 つは、ユーザーのシェル環境で cron ジョブが実行されないことです。別の理由として、スクリプトで使用されるコマンドの絶対パスを指定していないことが考えられます。スクリプトを手動で実行する場合、PATH などの環境変数は、cron から実行する場合とは異なる場合があります。そのため、スクリプトで使用されるコマンドの絶対パスを含めることを常にお勧めします。
そのため、通常のシェルに存在するユーザーの環境変数は、スクリプトによって明示的にインポートされない限り、cron ジョブの実行中に使用できません。
たとえば、シェルに ORACLE_HOME 変数が定義されていて、それを PATH 環境変数に含め、スクリプトがそれらの変数を使用する場合、スクリプトは Sell で実行されますが、crontab から実行する場合、スクリプトはそれらの変数を認識しません。
解決策
cron スクリプト ファイルで ORACLE_HOME と完全な PATH 変数を定義またはインポートします。これは、oracle ユーザー シェル内で確認できます (oracle_user_shell> echo $PATH)。
次のコマンドを使用して、スクリプト script.sh の先頭で常にユーザー環境をインポートすることをお勧めします。
#!/bin/bash . /home/oracle/.bashrc [rest of script]
これにより、/home/oracle/.bashrc が読み取られ、環境がインポートされます。ユーザーの環境によっては、/home/oracle/.bash_profile またはその他のファイルになることもあります。
注意 :ドット「.」の間にスペースがあります。および「/home..」ヒント :crontab エントリの実行をより適切にトラブルシューティングするには、出力をファイルに記録するように変更できます。たとえば、次のようにします。
[* * * * *] /home/oracle/script.sh 2> /tmp/crontab_script_log.txt 2>&1
注意 :[* * * * *] をケースの正しい実行時間に置き換えてください。
その後、実行の出力について /tmp/crontab_script_log.txt を確認できます。未定義の変数がある場合、またはスクリプトに他のエラーがある場合、出力により問題の原因を簡単に見つけることができます。