根据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。
真正发生了什么?
答案 0 :(得分:2)
不完全。所发生的事情正是文档所说的将会发生的事情。
exec
将当前正在运行的shell替换为ssh-agent
,因此"旧bash"现已被取代。
ssh-agent
看到它有一个非选项参数($SHELL
的值),因此它创建了一个子进程,并在子进程exec
中发出了该命令。这会导致ssh-agent
的孩子被新的bash
替换。
ssh-agent
本身现在等待孩子完成。
同时,新bash
继承了终端,因此它开始响应您的命令。
最终,你厌倦了做你正在做的事情,你要exit
或输入一个控件-D(文件结束),bash
进程终止
ssh-agent
注意到它的孩子已经完成,所以它也会退出。
如果原始bash
进程有父进程,则该父进程现在会收到通知其子进程已终止的通知。如果原始bash
的父级不再存在,则init
进程(进程1)已成为父级。在任何一种情况下,父母 - 假设它表现良好 - 做适当的事情并清理孩子的状态代码,以避免留下僵尸。
请注意"替换"表示已替换进程中运行的可执行文件。它并不意味着流程本身已经终止并且新流程已经开始。在调用exec
之后,进程仍然是相同的进程,具有相同的进程ID和相同的父进程(并且,就此而言,相同的控制终端和相同的打开文件描述符,除了文件描述符,该过程标记为"关闭exec")。如果前面的句子看起来太复杂,那么最小的外卖就是#34;同一个父母"。