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用我指定的程序替换了我当前的 shell。

我读了http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/ssh-agent.1?query=ssh-agent&sec=1,其中指出“如果给出命令行,这是作为代理的子进程执行。当命令死亡时,代理也会死亡。

所以我猜我期望的是 bash 被 ssh-agent 替换,但是因为我指定了一个命令行,所以执行了一个新的 bash,然后执行了 ssh-agent,并替换了旧的 bash。

到底发生了什么?

4

1 回答 1

2

不完全的。发生的事情正是文档所说的将发生的事情。

  1. exec用 替换当前运行的 shell ssh-agent,因此“旧 bash”现在已被替换。

  2. ssh-agent看到它有一个非选项参数( 的值$SHELL),所以它创建一个子进程并在子进程中创建exec该命令。这会导致ssh-agent's child 被替换为新的bash.

  3. ssh-agent它本身现在等待它的孩子完成。

  4. 同时,新bash的继承了终端,因此它开始响应您的命令。

  5. 最终,你厌倦了你正在做的任何事情,你要么exit或键入一个 control-D(文件结尾),bash进程就会终止。

  6. ssh-agent注意到它的孩子完成了,所以它也退出了。

  7. 如果原始bash进程有父进程,则该父进程现在会收到其子进程已终止的通知。如果原来bash的父进程不存在,则init进程(进程1)成为父进程。在任何一种情况下,父母(假设它表现良好)都会做一些适当的事情并清理孩子的状态代码以避免留下僵尸。

请注意,“replaced”表示进程中运行的可执行文件已被替换。这并不意味着进程本身已经终止并启动了一个新进程。调用之后exec,一个进程仍然是同一个进程,具有相同的进程 ID 和相同的父进程(并且,就此而言,相同的控制终端和相同的打开文件描述符,除了该进程已标记为的文件描述符被“关闭执行”)。如果前面这句话显得过于复杂,那么最小的外卖就是“同父异母”。

于 2014-10-26T03:35:42.137 回答