Search This Blog

2014-04-20

调试Bash脚本

近期做的一个项目是给各种客户端提供API,用到了Servlet 3.1,由于Jetty9率先实现了这个规范(GlassFish被我排除了),并且比较适合用来实现长连接(至少从历史以及宣传来看),就选择了这个。经过一段时间的试用之后,发现Jetty9难当大任,如果能修复问题,那可以继续使用,暂且先留着,同时另找了一个:WildFly。准备把所有可选容器的启动关闭脚本都统一到项目的bin目录下,便于使用,新建一些脚本文件,在这里通过source命令调用容器原有的脚本,需要额外配置的东西也写在这个脚本里,避免修改原有脚本。

先写跟项目无关的测试,没问题,正式的脚本就按照这个思路来写了。写完以后,测试,发现了两个问题,光看输出我是没法解决的,信息不足,对Bash又不够懂。想起调试,之前在<Linux 101 Hacks>看到过,找到-x选项:"Print commands and their arguments as they are executed."。用了下,挺好使的,问题很容易就解决了,简单说明一下。

1 第一个问题

这纯粹是自己写错了。

> ./bin/prj_jetty.sh
./bin/prj_jetty.sh: line 13: /home/u1/deploy2/prj_local/jetty/bin/jetty.sh : No such file or directory
报的错莫名其妙。

> bash -x ./bin/prj_jetty.sh
+ source '/home/u1/deploy2/prj_local/jetty/bin/jetty.sh '
./bin/prj_jetty.sh: line 13: /home/u1/deploy2/prj_local/jetty/bin/jetty.sh : No such file or directory
看到+开头的那句就明白了。以前的写法:source "$PRJ_HOME/jetty/bin/jetty.sh "$@"",当$@不存在的时候,多了一个空格,导致找不到脚本。需要写成 source "$PRJ_HOME/jetty/bin/jetty.sh" "$@"

2 第二个问题

这种思路跟jetty.sh的实现逻辑不兼容。

> bash -x ./bin/prj_jetty.sh start
+ source /home/u1/deploy2/prj_local/jetty/bin/jetty.sh start
+++ sed -e 's/^[SK][0-9]*//' -e 's/\.sh$//'
++++ basename ./bin/prj_jetty.sh
传给basename的是外层脚本的相关信息,basename的结果会赋值给NAME变量,NAME变量在后面多处被引用,这跟直接运行jetty.sh有差别,除非把prj_jetty.sh这个名字改为jetty.sh。但是即便这样,接下来还是会有错,因为jetty.sh假设自己是直接被运行的。

这种思路失败了,还是直接运行容器提供的脚本。

=文章版本=

20140419

No comments:

Post a Comment