在我的(Windows)桌面或(Windows或Unix)Jenkins服务器(我相信它使用了相同的底层JSch技术)上,我似乎无法随心所欲地调用Tomcat bin目录中的startup.sh脚本。Tomcat(7)位于Solaris 9服务器上。我有相当基本的Unix知识。
它执行成功(Tomcat启动良好),但在Tomcat进程终止之前从不返回。我想其他类似的脚本也会有同样的行为。
示例ant任务(命令与我在Jenkins"在远程主机上执行shell脚本"构建任务中输入的命令相同)
<?xml version="1.0" encoding="UTF-8"?>
<project name="remote-tomcat-controls" basedir=".">
<property name="hostname">someserver</property>
<property name="username">someuser</property>
<property name="password">somepassword</property>
<property name="port">22</property>
<property name="tomcathome">~/tomcat</property>
<target name="start-tomcat">
<sshexec host="${hostname}" port="${port}" username="${username}"
password="${password}" trust="true"
command=". ~/.profile; cd ${tomcathome}/bin; ./startup.sh" />
</target>
</project>
这成功地启动了Tomcat,但任务永远不会返回,除非/直到Tomcat进程在服务器上终止:
start-tomcat:
[sshexec] Connecting to someserver:22
[sshexec] cmd : . ~/.profile; cd ~/tomcat/bin; ./startup.sh
涉及3个命令:
- 导入用户配置文件,使Java位于路径中
- 更改为tomcat bin目录,以便日志文件的相对路径正常工作
- 启动Tomcat
我已经尝试将这些命令移动到服务器上的一个新脚本中,并让Ant任务简单地调用它,结果相同。
我已经尝试过用nohup和&结束命令;,运气也不好。
在交互式ssh会话中运行startup.sh脚本时得到的结果:
$ ./startup.sh
Using CATALINA_BASE: /home/ebiztest/tomcat-datasheets
Using CATALINA_HOME: /home/ebiztest/tomcat-datasheets
Using CATALINA_TMPDIR: /home/ebiztest/tomcat-datasheets/temp
Using JRE_HOME: /home/ebiztest/jdk1.6.0_34
Using CLASSPATH: /home/ebiztest/tomcat-datasheets/bin/bootstrap.jar:/home/ebiztest/tomcat-datasheets/bin/tomcat-juli.jar
$
控制将立即返回。
有什么想法吗?谢谢
响应"aa vv"的回答使用commandResource而不是命令,让我指向一个包含要运行的命令的本地文件(添加了更多命令用于演示):
pwd
. ~/.profile;java -version
pwd
java -version
pwd
cd ~/tomcat-datasheets/bin;pwd
pwd
./startup.sh
输出:
start-tomcat:
[sshexec] Connecting to servername:22
[sshexec] cmd : pwd
[sshexec] /home/ebiztest
[sshexec] cmd : . ~/.profile;java -version
[sshexec] java version "1.6.0_34"
[sshexec]
[sshexec] Java(TM) SE Runtime Environment (build 1.6.0_34-b04)
[sshexec]
[sshexec] Java HotSpot(TM) Server VM (build 20.9-b04, mixed mode)
[sshexec]
[sshexec] cmd : pwd
[sshexec] /home/ebiztest
[sshexec] cmd : java -version
[sshexec] java version "1.4.2_04"
[sshexec]
[sshexec] Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_04-b05)
[sshexec] Java HotSpot(TM) Client VM (build 1.4.2_04-b05, mixed mode)
[sshexec]
[sshexec] cmd : pwd
[sshexec] /home/ebiztest
[sshexec] cmd : cd ~/tomcat-datasheets/bin;pwd
[sshexec] /home/ebiztest/tomcat-datasheets/bin
[sshexec] cmd : pwd
[sshexec] /home/ebiztest
[sshexec] cmd : ./startup.sh
[sshexec] ksh: ./startup.sh: not found
似乎在不同的行上的命令是完全分开运行的,只有在同一行上用分号分隔的命令才能顺序执行。
使用'command'
选项,您似乎已经执行了一个命令/一组命令(两种情况:一种;运行单个命令行不支持单独的命令,或者不支持脚本调用)。
<sshexec host="${hostname}" port="${port}" username="${username}"
password="${password}" trust="true"
commandResource="wrapper_script" outputproperty="wrapper.output.prop"/>
<echo message="${wrapper.output.prop}"/>
使用蚂蚁手册中规定的commandResource
代替command
:http://ant.apache.org/manual/Tasks/sshexec.html看看这是否有帮助。
包装程序脚本
. ~/.profile
cd ${tomcathome}/bin
./startup.sh
尝试像这样链接命令:
command=". ~/.profile && cd ${tomcathome}/bin && ./startup.sh"