expect中杀死子进程

5052阅读 0评论2012-02-29 areece
分类:系统运维

应用场景:自制服务器,实现一些简单功能。用expect调用telnet作为客户端连接服务器,然后退出expect,发现telnet进程仍然存在,尝试在脚本中
  1. close
  2. wait
无法成功,没有wait时,子进程仍然存在,有wait时,expect挂起在那里。使用
  1. close -i $spawn_id
也无法让telnet子进程退出。Expect中的close只是实现了断开功能,但是并不能实现关闭子进程的功能。通常的假设是由于子进程检测到stdin的断开后能够自行了结,但是telnet显示没有实现这样的功能。

于是尝试
  1. exec kill -9 $spawn_id
还是无法杀死了进程,它还是好好地在那儿。通过打印,发现spawn_id并不是真正的进程ID,它只在expect内部有效。在网上找了一圈,发现通过下面的方法可以
  1. set tid [exp_id]
  2. exec kill -9 $tid
能够杀死子进程,只是不知道为什么下面的代码不行
  1. exec kill -9 [ exec ps | grep 'telnet' | awk '{print $1}' ]

其实,出现这样的问题,是因为telnet将所有的输入都改送给了服务器,如果服务器能够检测到输入中的eof,然后选择关闭子进程,子进程应该能够退出,而wait也能够返回。最后这段是我的猜想,还要通过实验验证。
上一篇:[english] catch a break or get a break
下一篇:vxworks实现的tftpd的实现缺陷