web-dev-qa-db-ja.com

非対話型シェルでスクリプトを実行しますか?

スクリプトを実行するcronジョブがあります。対話型シェル(ssh'ed to bash)を介してスクリプトを実行すると、正常に機能します。スクリプトがcron経由で単独で実行されると失敗します。

私の推測では、インタラクティブシェルで設定された環境変数の一部を使用しています。スクリプトのトラブルシューティングを行い、これらを削除します。

変更を加えた後、スクリプトをcronのキューに入れて通常どおりに実行できることを知っていますが、コマンドラインからスクリプトを実行する方法はありますが、そのまま実行するように指示します) cronから-つまり、非インタラクティブ環境で?

17
cwd

Cronからコマンドを実行する場合とコマンドラインで実行する場合の主な違いは次のとおりです。

  • cronはおそらく別のシェル(通常は_/bin/sh_)を使用しています。
  • cronは確実に小さな環境で実行されます(これはcronの実装に依存するため、cron(8)またはcrontab(5)のマニュアルページを確認してください。通常、HOME、おそらくShell、おそらくLOGNAMEUSER、および小さなPATH);
  • cronは_%_文字を特別に扱います(改行されます)。
  • cronジョブは、ターミナルまたはグラフィカル環境なしで実行されます。

次の呼び出しは、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
2
Kevin

スクリプトをcronに入れて他の場所で使用するときはスクリプトに絶対パスを使用し、そこで使用されるすべてのLinuxコマンドには絶対パスを使用することをお勧めします。変数として宣言し、それを使用してください!

1
Gaumire

cronの詳細に関係なく)非対話型シェルでスクリプトを実行するには、sshを使用してこれを実行できます。

最終的に非インタラクティブシェルになるかどうかをテストします。

> ssh someuser@somehost tty
not a tty

非インタラクティブシェルでスクリプトを実行します。

> ssh someuser@somehost /tmp/myscript.sh
0
dokaspar

スクリプトによって提供されるインタラクティブな質問を無視したい場合は、以下を試すことができます。

yes | your_command

またはyes "n"すべての質問を「いいえ」にしたい場合。

コマンド:

yes-繰り返し肯定的ですyesは無意味な出力、またはデフォルトでは「y」を永久に出力します。

0
kenorb

Cronは必ずしも使用しているのと同じシェルを使用する必要はありません。小切手:

cat /etc/crontab |grep Shell

シェルを特定し、そこでスクリプトの実行を試みるには-機能しますか?これは、cronにスクリプトを追加する多くの人にとって問題の一般的な原因です。

これが問題の場合、cronのスクリプトの先頭に「bash」を追加して、このスクリプトを強制的にbashで実行することができます。これで問題が解決しない場合は、お知らせください。少し掘り下げます。

0
Matt