Chinaunix首页 | 论坛 | 博客
  • 博客访问: 22357
  • 博文数量: 3
  • 博客积分: 260
  • 博客等级: 二等列兵
  • 技术积分: 80
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-18 11:10
文章分类

全部博文(3)

文章存档

2008年(3)

我的朋友

分类: LINUX

2008-04-03 17:32:59

有些程序/脚本可能在没有控制终端的环境下上执行(如系统启动服务时, Daemon,
或者是setsid启动的程序等) 但可能这个程序需要控制终端, 这这么办呢?

如我们的例子: 我们在linux启动时启动一个服务, 可是中间有个程序(旧的systemtap)使用了sudo
但sudo需要控制终端(当然可以通过修改sudo的配置文件, 但这样很对用户不友好啊)

例子: (setsid 启动的程序会失去控制终端)
# setsid sudo ls
sudo: sorry, you must have a tty to run sudo
(如果你的系统没有输出这句话, 那就是你的系统的sudo配置文件允许sudo可以在这个,
请确保已经设置了Defaults    requiretty)

没有控制中断的时候, 打开控制终端是这样的效果:
# setsid head -c 0 /dev/tty
head: cannot open `/dev/tty' for reading: No such device or address

为了解决这个问题, 所以应该使用能创建(伪)控制终端的程序来启动你的程序如: script, expect

如:
# setsid script -c "sudo ls" /dev/null
或:
# setsid expect -c 'spawn sudo ls; expect'

#打开控制终端成功:
# setsid script -c 'head -c 0 /dev/tty' /dev/null
# setsid expect -c 'spawn head -c 0 /dev/tty; expect'

不过 setsid 跟 script 组合使用有着奇怪的bug, 望有志之士调查并提交patch,
为开源做贡献, 谢谢

呵呵, 这样对script, expect来说, 都是大材小用了


阅读(957) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~