1

https://www.centos.org/docs/5/html/5.2/Deployment_Guide/s3-openssh-config-ssh-agent.htmlによると

私は実行する必要がexec /usr/bin/ssh-agent $SHELLあり、私が理解しているようにexec、現在のシェルを指定したプログラムに置き換えます。

「コマンドラインが指定されている場合、これはエージェントのサブプロセスとして実行されます。コマンドが終了すると、エージェントも終了します。"

つまり、bash が ssh-agent に置き換えられることを期待していると思いますが、コマンドラインを指定したため、新しい bash が実行され、次に ssh-agent が実行され、古い bash が置き換えられます。

本当に何が起こっているのですか?

4

1 に答える 1

2

そうではありません。何が起こるかは、ドキュメントが言うこととまったく同じです。

  1. exec現在実行中のシェルをssh-agentに置き換えるため、「古い bash」が置き換えられました。

  2. ssh-agent非オプションの引数 ( の値$SHELL) があることがわかるので、子プロセスを作成し、子プロセスでexecそのコマンドを実行します。これにより、ssh-agentの子が新しい に置き換えられbashます。

  3. ssh-agentそれ自体は、その子が終了するのを待ちます。

  4. 一方、新しいbash端末は端末を継承しているため、コマンドに応答し始めます。

  5. 最終的には、何をしていても飽きてしまい、プロセスが終了exitするコントロール D (ファイルの終わり) を入力するか、入力するかのいずれかになります。bash

  6. ssh-agentその子が終了したことに気づき、それも終了します。

  7. 元のbashプロセスに親があった場合、その親は、その子が終了したことを通知されるようになりました。元bashの の親が存在しなくなった場合、initプロセス (プロセス 1) が親になります。どちらの場合でも、親は (行儀が良いと仮定して) 適切な処理を行い、ゾンビから離れないように子のステータス コードをクリーンアップします。

「置換」とは、プロセスで実行されている実行可能ファイルが置換されたことを意味することに注意してください。プロセス自体が終了し、新しいプロセスが開始されたという意味ではありません。を呼び出しexecた後、プロセスは同じプロセスであり、同じプロセス ID と同じ親 (さらに言えば、プロセスがマークしたファイル記述子を除いて、同じ制御端末と同じオープン ファイル記述子) を持ちます。 「実行時に閉じられる」)。前の文が複雑すぎるように見える場合、最低限のポイントは「同じ親」です。

于 2014-10-26T03:35:42.137 に答える