web-dev-qa-db-ja.com

BASH_ENVおよびcronジョブ

非対話型、非ログインシェル、およびcronジョブに関連するいくつかの質問があります。

Q1。非対話型、非ログインシェルは$BASH_ENVのみを「ロード」することを読みました。これは正確にはどういう意味ですか? $BASH_ENVがファイルを指すことができ、このファイルがソースになるということですか?

Q2cronにBashShebangを含むBashスクリプトを指すエントリがあるとすると、Bashスクリプトがロードされていると想定できる環境変数と定義は何ですか?

Qcrontabの先頭にShell=/bin/bashを追加した場合、これは正確に何をしますか?それはそれを意味しますか:

  1. cron自体はBashで実行されますか?
  2. crontabのコマンド指定はBashで解釈されますか?
  3. notを実行するスクリプトにはshebangsが含まれており、$Shellの下で実行されます。

他に何か?

Q4:cronジョブにBASH_ENVを設定するにはどうすればよいですか?

Q1とQ2については、ここを参照してください。 Q3は、以下の他の3つの質問のディスカッションで回答されます。

WRT $BASH_ENVman bashから:

たとえば、bashが非対話的に開始されると、シェルスクリプトを実行するために、環境内の変数BASH_ENVを検索し、そこに表示されている場合はその値を展開し、展開された値を読み取りおよび実行するファイルの名前として使用します。 。

したがって、これは.profileタイプのスクリプトである可能性があります。どこで誰が設定したかは、コンテキストによって異なります。通常は設定されていませんが、現在のプロセスの祖先が設定した可能性があります。 cronはこれを特別に利用していないようで、AFAIKもinitを使用していません。

Cron自体がBashで実行されるということですか?

「in」とは、シェルから開始されることを意味します。これは、initシステムによって異なります。たとえば、SysVはサービスのシェルスクリプトを実行するため、これらのサービスは常にシェルを介して開始されます。

しかし、「in」が「シェルプロセスの子ですか?」という意味の場合、no。他のデーモンと同様に、独自のプロセスグループのリーダーとして実行され、その親プロセスは初期化プロセス(pid1)。

ただし、cronの環境への影響はおそらく重要ではありません。スタートアップサービスの環境の詳細については、Q1とQ2に関して上記のリンク先の回答を参照してください。特にcronへのWRTは、man 5 crontabによると、それもsets開始するプロセス($LOGNAME$HOME、および$Shell)によって継承されるいくつかの環境変数です。

Crontabで指定されたコマンドはBashで解釈されますか?

それらはshまたは$Shellで解釈されます。再びman 5 crontabから:

改行または「%」文字までの行のコマンド部分全体は、/ bin/shまたはcronfileのShell変数で指定されたShellによって実行されます。コマンド内の「%」文字は、バックスラッシュ()でエスケープしない限り、改行文字に変更され、最初の%以降のすべてのデータが標準入力としてコマンドに送信されます。

強調された部分はQ3に答えます。

シバンが含まれていないスクリプトは、$ Shellを使用して実行されます

シバンの有無にかかわらず実行可能なスクリプトは、$Shell(またはsh)によって開かれます。違いは、シバンを持っているものは適切なインタプリタ(#!/bin/shはシェルの別のインスタンスです)に渡されますが、executableスクリプト(実行可能ファイルとして参照される実行可能ビットが設定されているもの) Shebangは、コマンドラインから実行した場合と同じように(sh script.shを実行しない限り)単純に失敗します。

4
goldilocks