执行Shell脚本时需要注意的几项(本人理解,大家有不同的意见欢迎补充):
1、可以获取脚本输出到控制台的内容,不能够直接获取return的值;
2、 如果不知道服务器上脚本是否有可执行权限,可以通过“sh 脚本”执行;
3、如果脚本有参数,在参数上加上双引号防止参数值为空情况;
4、如果脚本需要限定目录执行,可以通过“cd 目录 && sh 脚本”执行;
直接提供本人在项目中写的Shell脚本工具类,代码如下:
package util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import org.apache.log4j.Logger;
/**
* Shell脚本工具类
*
* @author Jinlong Wu
* @version
* @since
*/
public class ShellUtil
{
/**
* 日志实例
*/
private static Logger log = Logger.getLogger(ShellUtil.class);
/**
* Shell类型
*/
public static final String SHELL_TYPE = "/bin/sh";
/**
* 线程等待超时时间
*/
public static final long PROCESS_TIMEOUT = 3000;
/**
*
* 执行Shell脚本
*
* @author Jinlong Wu
* @param shellScript
* Shell脚本
* @return 脚本执行结果
*/
public static String exec(String shellScript)
{
return exec(shellScript, PROCESS_TIMEOUT);
}
/**
*
* 执行Shell脚本
*
* @author Jinlong Wu
* @param shellScript
* Shell脚本
* @param timeout
* 脚本执行等待时间
* @return 脚本执行结果
*/
public static String exec(String shellScript, long timeout)
{
// 命令执行失败,默认返回-1
String result = "-1";
// 命令执行线程数据读取器
BufferedReader br = null;
try
{
// 执行Shell脚本
Process process = Runtime.getRuntime().exec(new String[]
{SHELL_TYPE, "-c", shellScript});
synchronized (process)
{
// 获取执行结果
br = new LineNumberReader(new InputStreamReader(process
.getInputStream()));
// 等待线程响应结果
process.wait(timeout);
// 读取脚本执行结果
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null)
{
sb.append(line);
}
result = sb.toString();
}
}
catch (IOException e)
{
log.error("Execute the script[" + shellScript + "] failed.", e);
}
catch (InterruptedException e)
{
log.error("Execute the script[" + shellScript + "] failed.", e);
}
finally
{
if(null != br)
{
try
{
br.close();
}
catch (Exception e)
{
log.error(e);
}
}
}
return result;
}
/**
*
* 执行Shell脚本
*
* @author Jinlong Wu
* @param shellScript
* Shell脚本
* @param timeout
* 脚本执行等待时间
* @param paras
* 脚本参数
* @return 脚本执行结果
*/
public static String exec(String shellScript, long timeout, String... paras)
{
StringBuffer sb = new StringBuffer();
sb.append(shellScript);
if (null != paras && paras.length > 0)
{
for (String str : paras)
{
sb.append(" ").append("\"").append(str).append("\"");
}
}
return exec(sb.toString(), timeout);
}
/**
*
* 执行Shell脚本
*
* @author Jinlong Wu
* @param shellScript
* Shell脚本
* @param paras
* 脚本参数
* @return 脚本执行结果
*/
public static String exec(String shellScript, String... paras)
{
StringBuffer sb = new StringBuffer();
sb.append(shellScript);
if (null != paras && paras.length > 0)
{
for (String str : paras)
{
sb.append(" ").append("\"" + str + "\"");
}
}
return exec(sb.toString());
}
}