免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9766 | 回复: 16
打印 上一主题 下一主题

求助 expect: 如何使用expect执行自定义的脚本 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-08 11:54 |只看该作者 |倒序浏览
本帖最后由 ouyangting_2000 于 2012-05-08 12:43 编辑

我现在使用expect远程登录执行一个自定义的脚本
expect脚本如下:
#!/usr/bin/expect -f
cmd=$1
expect << EOF
spawn sh $cmd
expect "*Please select:*"
send "2\r"
expect EOF

$1是自定义脚本的路径,作为参数传进expect里的。

自定义脚本如下:
#!/bin/sh
env=""
choice=""
logdir=../log
nfs_dir=file:///
if ["$1" == ""]; then
  echo 'Enviroments:'
  echo '[0]: stage00'
  echo '[1]: stage01'
  echo '[2]: stage02'
  echo '[3]: production'

  while [ "$choice" != "0" -a "$choice" != "1" -a "$choice" != "2" -a "$choice" != "3" ]
  do
    read -p 'Please select: ' choice
  done

  case $choice in
    0) env="stage00";;
    1) env="stage01"
        node=`hostname -s` ;;
    2) env="stage02"
                node=`hostname -s` ;;
    3) env="production"
        node=`hostname -s`
                logdir=/opt/log;;
  esac
else
  env="$1"
fi

if [[ ! -d  ${logdir} ]]; then
  mkdir ${logdir}
  echo "make the log dir"
fi

echo env is $env
cp ../etc/log4j-$env ../etc/log4j.xml
echo cp succesful
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${logdir} -Xms128M -Xmx256M -Dcps-atm -Dlog.dir=${logdir}  -Dnode=${node} -Dnfs.dir=$nfs_dir -classpath ../etc:../lib/cps-atm-srv-rt-2.12.0.jar com.bill99.cps.atm.srv.rt.CPSATMStartupMain >>  ${logdir}/cps-atm.log 2>&1 &
~

运行后一直到“cp ../etc/log4j-$env ../etc/log4j.xml”这段都能正常运行,唯独最后一段被跳过没有被执行,也没有任何报错,下面的shell脚本经过手动运行确认是没有任何问题的,请问各位大大,这是何解?

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2012-05-08 12:12 |只看该作者
你用shell语法写了个expect脚本?
下面的内容没看

论坛徽章:
0
3 [报告]
发表于 2012-05-08 12:33 |只看该作者
我是用expect的脚本去调用shell的脚本。
下面的shell脚本是某应用的启动脚本,因为牵涉到要手动选择环境变量,所以就想用expect去实现这个功能。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
4 [报告]
发表于 2012-05-08 13:14 |只看该作者
cmd=$1
expect << EOF
这都是shell的语法,你要写expect脚本就要遵守expect的语法约定

论坛徽章:
0
5 [报告]
发表于 2012-05-08 15:45 |只看该作者
waker大大的意思是,这两行都有问题么?
第一行的$1是我多余了。
第二行不加的话会报command not found
[root@newtest-tomcat1 bin]# sh /opt/script/ScriptJava/test.exp start-cps-atm.sh
/opt/script/ScriptJava/test.exp: line 3: spawn: command not found
couldn't read file "*Please select:*": no such file or directory
/opt/script/ScriptJava/test.exp: line 5: send: command not found

我这个写法有问题么?

论坛徽章:
0
6 [报告]
发表于 2012-05-08 16:46 |只看该作者
command not found问题已解决,是我没有给expect脚本执行权限导致的。
脚本现在改成了这样:
#!/usr/bin/expect -f
set cmd "[lindex $argv 0]"
spawn sh $cmd
expect "*Please select:*"
send "2\r"
expect EOF
执行下来的结果仍然是shell脚本的最后一段没有得到执行,何解?

论坛徽章:
0
7 [报告]
发表于 2012-05-09 10:05 |只看该作者
顶上,谁能帮我看看,为啥最后一段java应用启动的语句没有被执行么?

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
8 [报告]
发表于 2012-05-09 10:30 |只看该作者
#!/usr/bin/expect -d
观察一下
另外你是如何判断哪个部分运行或没有运行的?

论坛徽章:
0
9 [报告]
发表于 2012-05-09 11:57 |只看该作者
估计是shell中有关java的那个部分的变量问题。-d看下过程。

论坛徽章:
0
10 [报告]
发表于 2012-05-09 15:33 |只看该作者
......
echo env is $env
cp ../etc/log4j-$env ../etc/log4j.xml
echo cp succesful

java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${logdir} -Xms128M -Xmx256M -Dcps-atm -Dlog.dir=${logdir}  -Dnode=${node} -Dnfs.dir=$nfs_dir -classpath ../etc:../lib/cps-atm-srv-rt-2.12.0.jar com.bill99.cps.atm.srv.rt.CPSATMStartupMain >>  ${logdir}/cps-atm.log 2>&1 &
~


执行结果如下:
[root@newtest-tomcat1 bin]# /opt/script/ScriptJava/test.exp test.sh
spawn ./test.sh
Enviroments:
[0]: stage00
[1]: stage01
[2]: stage02
[3]: production
Please select: 2
env is stage02
cp succesful
[root@newtest-tomcat1 bin]#

打印信息显示都是正常的,唯独最后的java进程没有起起来
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP