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


17

スクリプトを実行しているcronジョブがあります。対話型シェル(bashに切り替えられた)を介してスクリプトを実行すると、正常に動作します。スクリプトがcronを介して単独で実行されると、失敗します。

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

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


関連しており、したがって役立つ可能性がある:「kshシェルでクリーンな環境を取得する方法」特に@Gillesに関する回答をご覧くださいunset
sr_

1
@sr_のリンクから、私が調べたところenv、試してみてくださいenv -i ./my-script.sh。また、エラーメッセージが表示されますか?
ケビン

どのcron実装を使用していますか?
rozcietrzewiacz

@kevin-あなたがそれに答えたらそれを支持します。
cwd

回答:


12

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

  • cronはおそらく別のシェル(通常は/bin/sh)を使用しています。
  • cronは間違いなく小さな環境で実行されています(これはcronの実装に依存するため、cron(8)またはcrontab(5)manページを確認してください。一般的にはHOME、おそらくSHELL、おそらくLOGNAME、おそらくUSER、そしてsmallがありますPATH)。
  • cronは%文字を特別に扱います(改行に変換されます)。
  • 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スクリプトを実行することも参照してください。これは問題の解決に役立つ場合があります。


こんにちは、@ Giles-何かを考えただけで-スクリプトsudo -u user /path/to/scriptを実行することは、変数を設定せずに実行する方法でもありますか?
cwd

@cwdいいえ、通常はありません。sudo一部の変数をクリアし、他の変数を既知の値に設定しますが、それは設定方法によって異なります。多くの場合TERM、ロケール設定を保持するように構成されています。
ジル 'SO-邪悪なことをやめる

2

@sr_のリンク(kshシェルでクリーンな環境を取得する方法?)から、envを検索しました。これを試してみてください。

env -i ./my-script.sh

@Gillesの回答も本当に良いのですが、これは私にとってはうまくいきました。
cwd

@cwd:DOESは私のために動作しない:echo -e '#!/bin/bash -i\necho interactive $-' > ~/test.sh && chmod +x ~/test.sh && env -i ~/test.sh出力をinteractive himB
アリックスアクセル

1

スクリプトをcronに入れて他の場所で使用するとき、およびスクリプトで使用されるすべてのLinuxコマンドに絶対パスを使用することをお勧めします。


はい。しかし、もちろん。
CWD

0

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

cat /etc/crontab |grep SHELL

シェルを決定し、そこでスクリプトの実行を試みるために-動作しますか?これは、cronにスクリプトを追加する多くの人々の問題の一般的な原因です。

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


0

いくつかのスクリプトで提供されるインタラクティブな質問を無視したい場合は、次を試してください:

yes | your_command

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

コマンド:

yes-繰り返し肯定的にyesを出力します。デフォルトでは「y」を永久に使用します。


0

スクリプトを非対話型シェルで実行するには(の詳細に関してではありませんcron)、を介してこれを実行できますssh

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

> ssh someuser@somehost tty
not a tty

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

> ssh someuser@somehost /tmp/myscript.sh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.