Expect脚本因追加输出到nohup.out停滞问题求助
解决Expect脚本中nohup输出重定向问题
问题场景
我首次编写Expect脚本,原本是个简单脚本:
#!/usr/bin/expect set timeout 200 spawn XXX/bin/PROGRAM expect "Choose an option ..." send "1\r" ...
程序包含多个选项,我基于这些选项写的4个类似脚本都正常运行,但其中某个选项在执行到终止若干进程的expect-send代码块时,被spawn的程序抛出以下消息:
nohup: appending output to 'nohup.out'
直接在命令行运行该程序完全无此异常,因此判断问题出在spawn创建的进程输出重定向逻辑上,尝试多种方法均未解决,希望让Expect脚本创建的进程和终端运行表现一致,避免输出被重定向到nohup.out。
可行解决方法
显式设置终端环境变量
被spawn的程序可能因为检测不到终端类型而触发nohup的默认输出行为,在spawn前设置TERM为终端常用类型(如xterm),让程序认为自己处于真实终端环境:set env(TERM) xterm spawn XXX/bin/PROGRAM重定向nohup输出到/dev/null
如果程序内部硬编码调用了nohup,可在spawn时直接重定向其输出,避免生成nohup.out。注意此方法可能影响Expect对程序输出的匹配,需根据脚本逻辑调整:spawn XXX/bin/PROGRAM > /dev/null 2>&1模拟终端交互模式
在执行到出问题的代码块前,切换到interact模式让程序与真实终端交互,完成关键步骤后再回到脚本控制(适合半自动化场景):# 在出现问题的步骤前加入 interact { "终止进程的提示文本" { send "确认命令\r"; exp_continue } "操作完成提示" { return } }绑定输出到真实终端设备
将程序的标准输出和错误输出指向真实终端设备/dev/tty,模拟命令行运行时的输出环境:set env(STDOUT) /dev/tty set env(STDERR) /dev/tty spawn XXX/bin/PROGRAM
内容的提问来源于stack exchange,提问作者Brorx
相关产品推荐
相关产品推荐

