#!/usr/bin/expect -f
set ipaddr "localhost"
set passwd "iforgot"
spawn ssh root@$ipaddr #spawn 意思是执行命令,expect内命令,shell中不存在
expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "$passwd\r" }
}
expect "]# "
send "touch a.txt\r" #意思为发送命令
send "exit\r"
expect eof
exit
在上面的脚本中第4句的spawn命令实际上是运行了ssh(一个进程,并且这个进程是spawn的子进程,即spawn是一个父进程),并且有一个默认的全局变量spawn_id绑定到了ssh。
spawn ssh root@$ipaddr
而close是用来关闭与spawn_id对应的子进程的连接,并且将子进程杀死。并且close在关闭连接后会返回一个数,系统会获得这个数以及子进程是怎么死的相关信息。
但是如果close后面没有wait的话,子进程虽然死了,但是依然存在进程列表中,此时这样的子进程叫做僵尸进程。僵尸进程会占用进程号,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程
所以wait说的专业一点是监视一个进程的终止。简单点就是负责给子进程收尸的。
另外close,wait可以隐含地产生。expect和interact都能检测到当前程序的退出,并隐含地执行一个close,但是wait只会在父进程退出时(即脚本退出时)隐含产生。所以对于只有一个子进程的脚本在exit后可以不写wait。
exit退出一个进程,exit后面可以跟一个句柄,用来指定要退出的进程(exit -onexit $handler);也可以不跟,那就是默认退出当前进程(一般会是脚本)。并且exit会在脚本的末尾被隐含地产生。
return 从一个过程返回。
问题:close 与exit的区别