スクリプトを実行するcronジョブがあります。対話型シェル(ssh'ed to bash)を介してスクリプトを実行すると、正常に機能します。スクリプトがcron経由で単独で実行されると失敗します。
私の推測では、インタラクティブシェルで設定された環境変数の一部を使用しています。スクリプトのトラブルシューティングを行い、これらを削除します。
変更を加えた後、スクリプトをcronのキューに入れて通常どおりに実行できることを知っていますが、コマンドラインからスクリプトを実行する方法はありますが、そのまま実行するように指示します) cronから-つまり、非インタラクティブ環境で?
Cronからコマンドを実行する場合とコマンドラインで実行する場合の主な違いは次のとおりです。
/bin/sh
_)を使用しています。cron(8)
またはcrontab(5)
のマニュアルページを確認してください。通常、HOME
、おそらくShell
、おそらくLOGNAME
USER
、および小さなPATH
);%
_文字を特別に扱います(改行されます)。次の呼び出しは、cronから呼び出されたかのようにシェルスニペットを実行します。スニペットに_'
_または_%
_の文字が含まれていないと思います。
_env - HOME="$HOME" USER="$USER" PATH=/usr/bin:/bin /bin/sh -c 'Shell snippet' </dev/null >job.log 2>&1
_
問題の解決に役立つ可能性がある cronからshスクリプトを実行する も参照してください。
@sr_のリンク( kshシェルでクリーンな環境を取得する方法? )から、envを検索しました。
env -i ./my-script.sh
スクリプトをcronに入れて他の場所で使用するときはスクリプトに絶対パスを使用し、そこで使用されるすべてのLinuxコマンドには絶対パスを使用することをお勧めします。変数として宣言し、それを使用してください!
(cron
の詳細に関係なく)非対話型シェルでスクリプトを実行するには、ssh
を使用してこれを実行できます。
最終的に非インタラクティブシェルになるかどうかをテストします。
> ssh someuser@somehost tty
not a tty
非インタラクティブシェルでスクリプトを実行します。
> ssh someuser@somehost /tmp/myscript.sh
スクリプトによって提供されるインタラクティブな質問を無視したい場合は、以下を試すことができます。
yes | your_command
またはyes "n"
すべての質問を「いいえ」にしたい場合。
コマンド:
yes-繰り返し肯定的ですyesは無意味な出力、またはデフォルトでは「y」を永久に出力します。
Cronは必ずしも使用しているのと同じシェルを使用する必要はありません。小切手:
cat /etc/crontab |grep Shell
シェルを特定し、そこでスクリプトの実行を試みるには-機能しますか?これは、cronにスクリプトを追加する多くの人にとって問題の一般的な原因です。
これが問題の場合、cronのスクリプトの先頭に「bash」を追加して、このスクリプトを強制的にbashで実行することができます。これで問題が解決しない場合は、お知らせください。少し掘り下げます。