请解释Linux bash exec和ssh-agent行为

时间:2014-10-26 02:17:25

标签: linux bash shell exec ssh-agent

根据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。

真正发生了什么?

1 个答案:

答案 0 :(得分:2)

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

  1. exec将当前正在运行的shell替换为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)已成为父级。在任何一种情况下,父母 - 假设它表现良好 - 做适当的事情并清理孩子的状态代码,以避免留下僵尸。

  8. 请注意"替换"表示已替换进程中运行的可执行文件。它并不意味着流程本身已经终止并且新流程已经开始。在调用exec之后,进程仍然是相同的进程,具有相同的进程ID和相同的父进程(并且,就此而言,相同的控制终端和相同的打开文件描述符,除了文件描述符,该过程标记为"关闭exec")。如果前面的句子看起来太复杂,那么最小的外卖就是#34;同一个父母"。