如何检查shell脚本在java中是否成功执行
我的代码是这样的 脚本“script.sh”需要大约7分钟才能完全执行如何检查shell脚本在java中是否成功执行,java,shell,Java,Shell,我的代码是这样的 脚本“script.sh”需要大约7分钟才能完全执行 private void function(String par1,String par2,String par3,String par4){ String logFile = logFolder + par1 + "_label.log"; String cmd = " /bin/sh " + scriptFolder + "script.sh" + " " +
private void function(String par1,String par2,String par3,String par4){
String logFile = logFolder + par1 + "_label.log";
String cmd = " /bin/sh " + scriptFolder + "script.sh" + " " +
par1 + " "
+ par2 + " "
+ par3 + " "
+ par4 + " > " +
logFile + " 2>&1 ";
logger.info("label update script" +cmd);
/* vm info */
String host = ConstantsServers.LABEL_UPDATE_SERVER;
String user = "USER";
String passwd = System.getenv("USER_PW");
/*
* start the script as user on the server
*/
new RunCmdViaSSH(host, user, passwd, cmd);
logger.debug("Log file created at:" +logFile);
}
此代码执行shell脚本并将输出存储在日志文件中。
如何在java中检查此shell脚本是否成功运行。
请建议
我试着用一个文件读取器检查文件的最后一行,代码如下
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
//checks whether the script ran successfully or not
String strLine = null,tmp;
while ((tmp = br.readLine()) != null) {
strLine=tmp;
}
String lastLine = strLine;
logger.debug(lastLine);
if (lastLine.contains("script ran successfully")) {
logger.debug("script passed");
}
else{
logger.debug("script failed");
}
但这段代码的问题是,它不会等到日志文件完全更新,它只会读取前几行并打印其余部分
还有别的办法吗?
请建议一种方法是在脚本末尾执行一个
.jar
,在该.jar
中,您可以检查它是否成功完成,也可以点击URL(如果有)在脚本末尾通知其他组件。取决于您的场景。处理此问题的最佳方法是使用ProcessBuilder API,它将为您提供对执行的控制。
您可以利用它的流程API等待处理,直到它完成执行,并返回退出代码。(同步处理)
下面是如何使用此API的示例
ProcessBuilder pb = new ProcessBuilder("script.sh", arg1, arg2);
Process p = pb.start();
int exitCode = p.waitFor();
您需要检查进程是否终止,您可以使用p.waitFor()
执行此操作,直到进程完成。此调用的返回值是您调用的系统命令的返回代码
如果exitCode值为0,则表示已成功执行
最适合您的需要,因为它
如有必要,使当前线程等待进程结束
由此进程对象表示的已终止
您可以通过java建立ssh连接,然后使用此连接执行命令。就像在自己的机器上通过Java运行命令一样,您可以在这个连接上运行命令。这样你就可以使用
Process process = Process.getRuntime().exec(sshCmd);
// you should get error stream and check for errors before waiting
process.getOutputStream().println(yourCmd);
process.waitFor();
// now process is finished and you can get full output from process.getInputstream()
看一看
您可以使用sshpass自动化ssh登录,我认为还有其他一些方法可以做到这一点。在google上搜索“带密码的ssh”。您可能应该等到
runcmdviash
实际完成。不幸的是,我找不到有关runcmdviash
的任何信息。但是如何使用此API将shell脚本的输出存储到日志文件中。此链接应该可以帮助您完成此操作