一、需求:
在编写java程序时,需要调用系统提供的服务:我的需求时,在程序运行的某个点使用linux系统服务清空内存中的文件缓存。
linux提供了
/proc/sys/vm/drop_caches
工具进行内存的清理:我前面的blog有提及:http://blog.csdn.net/yumengkk/article/details/6897567
这时就需要在java中调用linux脚本或者命令:
二、 书归正转:
在java程序中如何调用linux的命令?如何调用shell脚本呢?
这里不得不提到java的process类了。
1、process这个类是一个抽象类,封装了一个进程(你在调用linux的命令或者shell脚本就是为了执行一个在linux下执行的程序,所以应该使用process类)。
process类提供了执行从进程输入,执行输出到进程,等待进程完成,检查进程的推出状态,以及shut down掉进程。
2、Runtime类,Runtime类是一个与JVM运行时环境有关的类,这个类是Singleton的。
这里用到的Runtime.getRuntime()方法是取得当前JVM的运行环境,也是java中唯一可以得到运行环境的方法。(另外,Runtime的大部分方法都是实例方法,也就是说每次运行调用的时候都需要调用到getRuntime方法)
下面说说Runtime的exec()方法,这里要注意的有一点,就是public Process exec(String []cmdArray, String []envp);这个方法中cmdArray是一个执行的命令和参数的字符串数组,数组的第一个元素是要执行的命令往后依次都是命令的参数,envp感觉应该和C中的execve中的环境变量是一样的,envp中使用的是name=value的方式。
下面说一下,如何使用process来调用shell脚本
例如,我需要在linux下实行linux命令:sh test.sh,下面就是执行test.sh命令的方法:
说明:
1<wbr><wbr> shpath:是/test/test.sh也就是我们要执行的sh脚本的完整路径+脚本名称</wbr></wbr>
2<wbr> var是一个参数,可以有也可以没有,当然这个参数取决于你的sh脚本中是否使用到了这个参数,因为我的脚本中使用到了这个var参数,在linux下面执行的时候是 sh test.sh<wbr> a.tar</wbr></wbr>
这个var参数就是a.tar这个tar包的名字。
String command1 = “chmod 777 ” + shpath;
<wbr><wbr><wbr><wbr>process= Runtime.getRuntime().exec(command1);<br><wbr><wbr><wbr><wbr>process.waitFor();<br><wbr><wbr><wbr><wbr>Stringvar= “a.tar”;<br><wbr><wbr><wbr><wbr>Stringcommand2 = “/bin/sh ” + shpath + ” ” + var;<br><wbr><wbr><wbr><wbr>Runtime.getRuntime().exec(command2).waitFor();</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
注意:
1
我为什么要使用 chmod777命令呢?在有的机器上面,可能没有设置权限问题。这是你在linux下面执行shell脚本需要注意的问题。没有的话,就需要添加权限,就用chmod777,否则在执行到Runtime.getRuntime().exec的时侯会出现Permission denied错误。
2
waitFor()这个也是必不可缺的,等待进程执行完毕。如果你需要执行多行命令的话,把waitFor()这个加上。