在中间件的开发过程中,我们和linux随时需要打交道。而中间件也需要部署在Linux主机上。我们有时也需要用Java来控制Linux主机来执行一些脚本或命令,比如监测程序在执行时的运行情况(cpu占用率,内存占用率,磁盘使用情况...)
那么如何来进行操作呢,下面我将通过一个demo来为大家演示一下:
执行linux命令的工具类:
public class ShellUtils {
// 执行linux脚本
public static String executeFile(String cmd) throws Exception {
StringBuffer result = new StringBuffer();
BufferedReader buff = null;
// 创建一个进程
Process process = null;
try {
// 执行脚本
process = Runtime.getRuntime().exec(cmd);
InputStream in = process.getInputStream();
buff = new BufferedReader(new InputStreamReader(in));
String line = null;
// 防止死锁,将导致当前线程等待,直到该对象的进程结束,才返回调用。
process.waitFor();
while ((line = buff.readLine()) != null) {
result.append(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (buff != null) {
buff.close();
}
if (process != null) {
process.destroy();
}
}
return result.toString();
}
// 执行linux命令 多个命令用;隔开
public static String[] executeShell(String shell) throws Exception {
StringBuffer result = new StringBuffer();
StringBuffer errResult = new StringBuffer();
BufferedReader buff1 = null;
BufferedReader buff2 = null;
// 创建进程
Process process = null;
String[] cmd = { "/bin/bash", "-c", shell };
try {
// 执行进程
process = Runtime.getRuntime().exec(cmd);
// 接收正常返回信息
buff1 = new BufferedReader(new InputStreamReader(process.getInputStream()));
// 接受错误返回信息
buff2 = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line = null;
// 防止死锁,将导致当前线程等待,直到该对象的进程结束,才返回调用。
process.waitFor();
while ((line = buff1.readLine()) != null) {
result.append(line);
}
while ((line = buff2.readLine()) != null) {
errResult.append(line);
}
return new String[] { result.toString(), errResult.toString() };
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (buff1 != null) {
buff1.close();
}
if (buff2 != null) {
buff2.close();
}
if (process != null) {
process.destroy();
}
}
}
}
主函数:
public class Main {
public static void main(String[] args) throws Exception {
// 执行sh脚本
ShellUtils.executeFile("/opt/test/test.sh");
// 执行linux命令
ShellUtils.executeShell("date>/opt/test/date.sh;echo 'this is linux return!' ");
}
}
在执行之前。首先我们需要创建一个脚本test,里面写入以下代码:
#!/bin/bash
touch test.txt|echo "hello world">test.txt
ps -aux|grep shellTest.jar
然后我们将程序打成名为shellTest.jar的包部署到linux服务器上去执行 java -jar shellTest.jar 运行程序。
不会打包的同学可以看我的这篇文章:eclipse打jar包
由于在公司外网没有linux环境,在这里我就不进行测试了。
需要注意的是:shellUtils工具类中的两个方法返回值指的是执行linux命令后linux控制台打印的结果,举例说明就是你在linux上执行date会返回具体的时间。而执行mv date.txt ../ 则不会有返回结果。
希望这篇文章能给大家带来帮助,喜欢的朋友点个赞哦~~