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

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

スクリプトを実行するクローンジョブがあります。対話型シェル(sshからbashまで)を介してスクリプトを実行すると、正常に動作します。スクリプトがcronを介して独自に実行されると失敗します。

私の考えでは、対話型シェルに設定されたいくつかの環境変数を使用しているようです。スクリプトの問題を解決して削除します。

変更したら、cronにスクリプトをキューに入れて正常に実行できることを知っていますが、コマンドラインでスクリプトを実行する方法はありますが、cronで実行されているかのように(非対話型環境で)実行するように指示できますか?

答え1

cronでコマンドを実行することとコマンドラインでコマンドを実行することの主な違いは次のとおりです。

  • cronは他のシェル(通常/bin/sh)を使用できます。
  • cronは確かに小規模環境で実行されます(環境はcronの実装によって異なりますので、マニュアルページを確認してください。通常、cron(8)Maybe、Maybe、Maybe、および小規模環境のみ)。crontab(5)HOMESHELLLOGNAMEUSERPATH
  • cronは%この文字を特別に扱います(改行文字に変換)。
  • クローンジョブを実行するために端末やグラフィック環境は必要ありません。

次の呼び出しは、cronで呼び出されたようにシェルフラグメントを実行します。フラグメントに文字'またはが含まれていないとします%

env - HOME="$HOME" USER="$USER" PATH=/usr/bin:/bin /bin/sh -c 'shell snippet' </dev/null >job.log 2>&1

また、見ることができますcronでshスクリプトを実行する、トラブルシューティングに役立ちます。

答え2

非対話型シェルでスクリプトを実行するには(詳細に関係なくcron)を介して実行できますssh

実際に非対話型シェルに入っているかどうかをテストします。

> ssh someuser@somehost tty
not a tty

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

> ssh someuser@somehost /tmp/myscript.sh

答え3

@ sr_のリンク(kshシェルからきれいな環境を取得するには?)、環境を探してみましたが、次のことを試してみることもできます。

env -i ./my-script.sh

答え4

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

関連情報