Chinaunix首页 | 论坛 | 博客
  • 博客访问: 527302
  • 博文数量: 118
  • 博客积分: 2575
  • 博客等级: 大尉
  • 技术积分: 1263
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-27 09:37
文章分类

全部博文(118)

文章存档

2017年(11)

2016年(8)

2015年(1)

2014年(9)

2013年(7)

2012年(38)

2011年(14)

2010年(18)

2009年(12)

分类: 系统运维

2012-02-29 17:32:38

应用场景:自制服务器,实现一些简单功能。用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也能够返回。最后这段是我的猜想,还要通过实验验证。
阅读(4889) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~