Ⅰ 用java实现一个模拟操作系统内核运行的程序。(1)进程控制:其中包括进程创建与撤销
在编写Java程序时,有时候需要在Java程序中执行另外一个程序。
1、启动程序Java提供了两种方法用来启动其它程序:
(1)使用Runtime的exec()方法
(2)使用ProcessBuilder的start()方法
不管在哪种操作系统下,程序具有基本类似的一些属性。一个程序启动后就程序操作系统的一个进程,进程在执行的时候有自己的环境变量、有自己的工作目录。Runtime和ProcessBuilder提供了不同的方式来启动程序,设置启动参数、环境变量和工作目录。
能够在Java中执行的外部程序,必须是一个实际存在的可执行文件,对于shell下的内嵌命令是不能直接执行的。
采用Runtime的exec执行程序时,首先要使用Runtime的静态方法得到一个Runtime,然后调用Runtime的exec方
法。可以将要执行的外部程序和启动参数、环境变量、工作目录作为参数传递给exec方法,该方法执行后返回一个Process代表所执行的程序。
Runtime有六个exec方法,其中两个的定义为:
public Process exec(String[] cmdarray, String[] envp, File dir)
public Process exec(String command, String[] envp, File dir)
cmdarray和command为要执行的命令,可以将命令和参数作为一个字符串command传递给exec()方法,也可以将命令和参数一个一个的方在数组cmdarray里传递给exec()方法。
envp为环境变量,以name=value的形式放在数组中。dir为工作目录。
可以不要dir参数,或者不要envp和dir参数,这样就多出了其它4个exec()方法。如果没有dir参数或者为null,那么新启动的
进程就继承当前java进程的工作目录。如果没有envp参数或者为null,那么新启动的进程就继承当前java进程的环境变量。
也可以使用ProcessBuilder类启动一个新的程序,该类是后来添加到JDK中的,而且被推荐使用。通过构造函数设置要执行的命令以及
参数,或者也可以通过command()方法获取命令信息后在进行设置。通过directory(File directory)
方法设置工作目录,通过environment()获取环境变量信息来修改环境变量。
在使用ProcessBuilder构造函数创建一个新实例,设置环境变量、工作目录后,可以通过start()方法来启动新程序,与Runtime的exec()方法一样,该方法返回一个Process对象代表启动的程序。
ProcessBuilder与Runtime.exec()方法的不同在于ProcessBuilder提供了
redirectErrorStream(boolean redirectErrorStream)
方法,该方法用来将进程的错误输出重定向到标准输出里。即可以将错误输出都将与标准输出合并。
2、Process
不管通过那种方法启动进程后,都会返回一个Process类的实例代表启动的进程,该实例可用来控制进程并获得相关信息。Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法:
(1) void destroy()
杀掉子进程。
一般情况下,该方法并不能杀掉已经启动的进程,不用为好。
(2) int exitValue()
返回子进程的出口值。
只有启动的进程执行完成、或者由于异常退出后,exitValue()方法才会有正常的返回值,否则抛出异常。
(3)InputStream getErrorStream()
获取子进程的错误流。
如果错误输出被重定向,则不能从该流中读取错误输出。
(4)InputStream getInputStream()
获取子进程的输入流。
可以从该流中读取进程的标准输出。
(5)OutputStream getOutputStream()
获取子进程的输出流。
写入到该流中的数据作为进程的标准输入。
(6) int waitFor()
导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。
通过该类提供的方法,可以实现与启动的进程之间通信,达到交互的目的。
3、从标准输出和错误输出流读取信息
从启动其他程序的Java进程看,已启动的其他程序输出就是一个普通的输入流,可以通过getInputStream()和getErrorStream来获取。
对于一般输出文本的进程来说,可以将InputStream封装成BufferedReader,然后就可以一行一行的对进程的标准输出进行处理。
4、举例
(1)Runtime.exec()import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
public class Test1 {
public static void main(String[] args) {
try {
Process p = null;
String line = null;
BufferedReader stdout = null;
//list the files and directorys under C:\
p = Runtime.getRuntime().exec("CMD.exe /C dir", null, new File("C:\\"));
stdout = new BufferedReader(new InputStreamReader(p
.getInputStream()));
while ((line = stdout.readLine()) != null) {
System.out.println(line);
}
stdout.close();
//echo the value of NAME
p = Runtime.getRuntime().exec("CMD.exe /C echo %NAME%", new String[] {"NAME=TEST"});
stdout = new BufferedReader(new InputStreamReader(p
.getInputStream()));
while ((line = stdout.readLine()) != null) {
System.out.println(line);
}
stdout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
(2)ProcessBuilderimport java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Test2 {
public static void main(String[] args) {
try {
List list = new ArrayList();
ProcessBuilder pb = null;
Process p = null;
String line = null;
BufferedReader stdout = null;
//list the files and directorys under C:\
list.add("CMD.EXE");
list.add("/C");
list.add("dir");
pb = new ProcessBuilder(list);
pb.directory(new File("C:\\"));
p = pb.start();
stdout = new BufferedReader(new InputStreamReader(p
.getInputStream()));
while ((line = stdout.readLine()) != null) {
System.out.println(line);
}
stdout.close();
//echo the value of NAME
pb = new ProcessBuilder();
mand(new String[] {"CMD.exe", "/C", "echo %NAME%"});
pb.environment().put("NAME", "TEST");
p = pb.start();
stdout = new BufferedReader(new InputStreamReader(p
.getInputStream()));
while ((line = stdout.readLine()) != null) {
System.out.println(line);
}
stdout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
5、获取进程的返回值
通常,一个程序/进程在执行结束后会向操作系统返回一个整数值,0一般代表执行成功,非0表示执行出现问题。有两种方式可以用来获取进程的返回
值。一是利用waitFor(),该方法是阻塞的,执导进程执行完成后再返回。该方法返回一个代表进程返回值的整数值。另一个方法是调用
exitValue()方法,该方法是非阻塞的,调用立即返回。但是如果进程没有执行完成,则抛出异常。
6、阻塞的问题
由Process代表的进程在某些平台上有时候并不能很好的工作,特别是在对代表进程的标准输入流、输出流和错误输出进行操作时,如果使用不慎,有可能导致进程阻塞,甚至死锁。
如果将以上事例中的从标准输出重读取信息的语句修改为从错误输出流中读取:stdout = new BufferedReader(new InputStreamReader(p
.getErrorStream()));
那么程序将发生阻塞,不能执行完成,而是hang在那里。
当进程启动后,就会打开标准输出流和错误输出流准备输出,当进程结束时,就会关闭他们。在以上例子中,错误输出流没有数据要输出,标准输出流中
有数据输出。由于标准输出流中的数据没有被读取,进程就不会结束,错误输出流也就不会被关闭,因此在调用readLine()方法时,整个程序就会被阻
塞。为了解决这个问题,可以根据输出的实际先后,先读取标准输出流,然后读取错误输出流。
但是,很多时候不能很明确的知道输出的先后,特别是要操作标准输入的时候,情况就会更为复杂。这时候可以采用线程来对标准输出、错误输出和标准输入进行分别处理,根据他们之间在业务逻辑上的关系决定读取那个流或者写入数据。
针对标准输出流和错误输出流所造成的问题,可以使用ProcessBuilder的redirectErrorStream()方法将他们合二为一,这时候只要读取标准输出的数据就可以了。
当在程序中使用Process的waitFor()方法时,特别是在读取之前调用waitFor()方法时,也有可能造成阻塞。可以用线程的方法来解决这个问题,也可以在读取数据后,调用waitFor()方法等待程序结束。
总之,解决阻塞的方法应该有两种:
(1)使用ProcessBuilder类,利用redirectErrorStream方法将标准输出流和错误输出流合二为一,在用start()方法启动进程后,先从标准输出中读取数据,然后调用waitFor()方法等待进程结束。
如:import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Test3 {
public static void main(String[] args) {
try {
List list = new ArrayList();
ProcessBuilder pb = null;
Process p = null;
String line = null;
BufferedReader stdout = null;
//list the files and directorys under C:\
list.add("CMD.EXE");
list.add("/C");
list.add("dir");
pb = new ProcessBuilder(list);
pb.directory(new File("C:\\"));
//merge the error output with the standard output
pb.redirectErrorStream(true);
p = pb.start();
//read the standard output
stdout = new BufferedReader(new InputStreamReader(p
.getInputStream()));
while ((line = stdout.readLine()) != null) {
System.out.println(line);
}
int ret = p.waitFor();
System.out.println("the return code is " + ret);
stdout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
(2)使用线程import java.util.*;
import java.io.*;
class StreamWatch extends Thread {
InputStream is;
String type;
List output = new ArrayList();
boolean debug = false;
StreamWatch(InputStream is, String type) {
this(is, type, false);
}
StreamWatch(InputStream is, String type, boolean debug) {
this.is = is;
this.type = type;
this.debug = debug;
}
public void run() {
try {
PrintWriter pw = null;
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
output.add(line);
if (debug)
System.out.println(type + ">" + line);
}
if (pw != null)
pw.flush();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
public List getOutput() {
return output;
}
}
public class Test5 {
public static void main(String args[]) {
try {
List list = new ArrayList();
ProcessBuilder pb = null;
Process p = null;
// list the files and directorys under C:\
list.add("CMD.EXE");
list.add("/C");
list.add("dir");
pb = new ProcessBuilder(list);
pb.directory(new File("C:\\"));
p = pb.start();
// process error and output message
StreamWatch errorWatch = new StreamWatch(p.getErrorStream(),
"ERROR");
StreamWatch outputWatch = new StreamWatch(p.getInputStream(),
"OUTPUT");
// start to watch
errorWatch.start();
outputWatch.start();
//wait for exit
int exitVal = p.waitFor();
//print the content from ERROR and OUTPUT
System.out.println("ERROR: " + errorWatch.getOutput());
System.out.println("OUTPUT: " + outputWatch.getOutput());
System.out.println("the return code is " + exitVal);
} catch (Throwable t) {
t.printStackTrace();
}
}
}
7、在Java中执行Java程序
执行一个Java程序的关键在于:
(1)知道JAVA虚拟机的位置,即java.exe或者java的路径
(2)知道要执行的java程序的位置
(3)知道该程序所依赖的其他类的位置
举一个例子,一目了然。
(1)待执行的Java类public class MyTest {
public static void main(String[] args) {
System.out.println("OUTPUT one");
System.out.println("OUTPUT two");
System.err.println("ERROR 1");
System.err.println("ERROR 2");
for(int i = 0; i < args.length; i++)
{
System.out.printf("args[%d] = %s.", i, args[i]);
}
}
}
(2)执行该类的程序
import java.util.*;
import java.io.*;
class StreamWatch extends Thread {
InputStream is;
String type;
List output = new ArrayList();
boolean debug = false;
StreamWatch(InputStream is, String type) {
this(is, type, false);
}
StreamWatch(InputStream is, String type, boolean debug) {
this.is = is;
this.type = type;
this.debug = debug;
}
public void run() {
try {
PrintWriter pw = null;
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
output.add(line);
if (debug)
System.out.println(type + ">" + line);
}
if (pw != null)
pw.flush();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
public List getOutput() {
return output;
}
}
public class Test6 {
public static void main(String args[]) {
try {
List list = new ArrayList();
ProcessBuilder pb = null;
Process p = null;
String java = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
String classpath = System.getProperty("java.class.path");
// list the files and directorys under C:\
list.add(java);
list.add("-classpath");
list.add(classpath);
list.add(MyTest.class.getName());
list.add("hello");
list.add("world");
list.add("good better best");
pb = new ProcessBuilder(list);
p = pb.start();
System.out.println(mand());
// process error and output message
StreamWatch errorWatch = new StreamWatch(p.getErrorStream(),
"ERROR");
StreamWatch outputWatch = new StreamWatch(p.getInputStream(),
"OUTPUT");
// start to watch
errorWatch.start();
outputWatch.start();
//wait for exit
int exitVal = p.waitFor();
//print the content from ERROR and OUTPUT
System.out.println("ERROR: " + errorWatch.getOutput());
System.out.println("OUTPUT: " + outputWatch.getOutput());
System.out.println("the return code is " + exitVal);
} catch (Throwable t) {
t.printStackTrace();
}
}
}
Ⅱ JAVA如何调用DOS命令
下面是一种比较典型的程序模式:
Process process = Runtime.getRuntime().exec(".\\p.exe");
process.waitfor( );
在上面的程序中,第一行的“.\\p.exe”是要执行的程序名,Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。通过Process可以控制该子进程的执行或获取该子进程的信息。第二条语句的目的等待子进程完成再往下执行。
但在windows平台上,如果处理不当,有时并不能得到预期的结果。下面是笔者在实际编程中总结的几种需要注意的情况:
1、执行DOS的内部命令
如果要执行一条DOS内部命令,有两种方法。一种方法是把命令解释器包含在exec()的参数中。例如,执行dir命令,在NT上, 可写成exec("cmd.exe /c dir"),在windows 95/98下,可写成“command.exe /c dir”,其中参数“/c”表示命令执行后关闭Dos立即关闭窗口。另一种方法是,把内部命令放在一个批命令my_dir.bat文件中,在Java程序中写成exec("my_dir.bat")。如果仅仅写成exec("dir"),Java虚拟机则会报运行时错误。前一种方法要保证程序的可移植性,需要在程序中读取运行的操作系统平台,以调用不同的命令解释器。后一种方法则不需要做更多的处理。
2、打开一个不可执行的文件
打开一个不可执行的文件,但该文件存在关联的应用程序,则可以有两种方式。 以打开一个word文档a.doc文件为例,Java中可以有以下两种写法:
exec("start .\\a.doc");
exec(" c:\\Program Files\\Microsoft Office\\office\\winword.exe .\\a.doc");
显然,前一种方法更为简捷方便。
3、执行一个有标准输出的DOS可执行程序
在windows平台上,运行被调用程序的DOS窗口在程序执行完毕后往往并不会自动关闭,从而导致Java应用程序阻塞在waitfor( )。导致该现象的一个可能的原因是,该可执行程序的标准输出比较多,而运行窗口的标准输出缓冲区不够大。解决的办法是,利用Java提供的Process类提供的方法让Java虚拟机截获被调用程序的DOS运行窗口的标准输出,在waitfor()命令之前读出窗口的标准输出缓冲区中的内容。一段典型的程序如下:
Ⅲ java 怎么取外部程序运行后的返回值
JAVA 中 process 类的使用
Process是一个抽象类 封装了一个进程
创建 process
Process p = Runtime.getRuntime().exec(cmd); cmd 是字符串类型 也可以是字符串类型的数组 内容就是 命令行
Process p =ProcessBuilder.start();
Process 类提供了子进程的输入流,子进程的输出流子进程的输入流,等待进程完成,检查进程的退出状态以及销毁进程的方法;
创建的子进程没有自己的控制台或终端,其所有的io操作都是通过(输入流、输出流、错误流)重定向到父进程中。
destroy()
杀掉子进程。
exitValue()
返回子进程的出口值。
InputStream getErrorStream()
获得子进程的错误流。
InputStream getInputStream()
获得子进程的输入流。
OutputStream getOutputStream()
获得子进程的输出流。
waitFor()
导致当前线程等待,如果必要,一直要等到由该 Process 对象表示的进程已经终止。
-------分割线,以上来自网络-------
其中的exitValue()函数返回值就是你需要的东西。按照你的示例,return 12345,取得的值不一定等于12345,因为每个不同的shell对于程序退出的返回值是有自己的定义的,不一定是把程序return的值直接返回。可以查看各类shell的编程帮助。
Ⅳ java 镓ц宻hell璇鍙 shell 镓ц宱racle璇鍙
//鐢ㄦ硶锛歊untime.getRuntime.exec("锻戒护");
Stringshpath="/test/test.sh";//绋嫔簭璺寰
Processprocess=null;
Stringmand1=钬渃hmod777钬+shpath;
try{
Runtime.getRuntime.exec(mand1).waitFor;
}catch(IOExceptione1){
e1.printStackTrace;
}catch(InterruptedExceptione){
e.printStackTrace;
}
Stringvar="201102";/鍙傛暟
Stringmand2=钬/bin/sh钬+shpath+钬钬+var;
Runtime.getRuntime.exec(mand2).waitFor;
// 鐢ㄦ硶锛歊untime.getRuntime.exec("锻戒护");
String shpath="/test/test.sh"; //绋嫔簭璺寰
Process process =null;
String mand1 = 钬渃hmod 777 钬 + shpath;
try {
Runtime.getRuntime.exec(mand1 ).waitFor;
} catch (IOException e1) {
e1.printStackTrace;
}catch (InterruptedException e) {
e.printStackTrace;
}
String var="201102"; /鍙傛暟
String mand2 = 钬/bin/sh 钬 + shpath + 钬 钬 + var;
Runtime.getRuntime.exec(mand2).waitFor;
Stringcmdstring="chmoda+xtest.sh";
Processproc=Runtime.getRuntime.exec(cmdstring);
proc.waitFor;//阒诲烇纴鐩村埌涓婅堪锻戒护镓ц屽畬
cmdstring="bashtest.sh";//杩欓噷涔熷彲浠ユ槸ksh绛
proc=Runtime.getRuntime.exec(cmdstring);
//娉ㄦ剰涓嬮溃镄勬搷浣
stringls_1;
BufferedReaderbufferedReader=newBufferedReader(newInputStreamReader(proc.getInputStream);
while绁ラ厤阈((ls_1=bufferedReader.readLine)!=null);
bufferedReader.close;
proc.waitFor;
涓轰粈璋ㄥソ涔堣佹湁涓婇溃闾f垫搷浣滃憿锛
铡熷洜鏄锛氩彲镓ц岀▼搴忕殑杈揿嚭鍙鑳戒细姣旇缉澶氾纴钥岃繍琛岀獥鍙g殑杈揿嚭缂揿啿鍖烘湁闄愶纴浼氶犳垚waitFor涓鐩撮樆濉炪傝В鍐崇殑锷炴硶鏄锛屽埄鐢↗ava鎻愪緵镄凯rocess绫绘彁渚涚殑getInputStream,getErrorStream鏂规硶璁㎎ava铏氭嫙链烘埅銮疯璋幂敤绋嫔簭镄勬爣鍑呜緭鍑恒侀敊璇杈揿嚭锛屽湪waitfor锻戒护涔嫔墠璇绘帀杈揿嚭缂揿啿鍖轰腑镄勫唴瀹广
鍦╦ava涓镓ц宻hell鑴氭湰 鐢ㄥ崠纰ф硶锛歊untime.getRuntime.exec("锻戒护");
String shpath="/test/test.sh"; //绋嫔簭璺寰
Process process =null;
String mand1 = 钬渃hmod 777 钬 + shpath;
try {
Runtime.getRuntime.exec(mand1 ).waitFor;
} catch (IOException e1) {
e1.printStackTrace;
}catch (InterruptedException e) {
e.printStackTrace;
}
String var="201102"; /鍙傛暟
String mand2 = 钬/bin/sh 钬 + shpath + 钬 钬 + var;
Runtime.getRuntime.exec(mand2).waitFor;
镙囩撅细浣沧枃缁忓吀 涓娄竴绡囷细涓涓浜哄甫澶寸殑鎴愯 涓涓鐚澶村甫澶寸殑鎴愯 涓嬩竴绡囷细鎻忓啓闀垮煄镄勮鍙 鎻忓啓闀垮煄缇庢櫙镄勮鍙浠ヤ笅鏄鎴戝湪鍏鍙搁”鐩涓瀹为檯搴旂敤鍒扮殑锛
/**
*镓ц岀郴缁熷懡浠
*@time2016/10/17$17:05$
*/
{
protectedstaticLoggerlogger=LoggerFactory.getLogger(ShareDiskFileUtils.class);
;
;
static{
Stringosname=System.getProperty("os.name").toLowerCase;
isWindow=osname.contains("win");
islinux=osname.contains("linux");
logger.info("绯荤粺鐜澧冿细"+(isLinux?"Linux":"Window"));
}
/**
*镓ц屽懡浠
*/
(Stringmand)throwsIOException,InterruptedException{
logger.info("镓ц岀郴缁熷懡浠わ细"+mand);
Processprocess=Runtime.getRuntime.exec(getCmdArray(mand));
newStreamPrinter(process.getInputStream,logger).start;
newStreamPrinter(process.getErrorStream,logger).start;
process.waitFor;
returnprocess;
}
/**
*杩欎釜闱炲父閲嶈侊纴濡傛灉浣犵洿鎺ユ墽琛宫and锛屼细鍑虹幇涓浜涢梾棰桡纴濡傛灉鍙傛暟涓鍖呭惈涓浜涚┖镙硷纴",'涔嬬被镄勭壒娈婂瓧绗︼纴灏嗕细镓ц屽け璐ワ纴
*/
privatestaticString[]getCmdArray(Stringmand){
if(isWindow){
returnnewString[]{"cmd","/c",mand};
}
if(isLinux){
returnnewString[]{"/bin/sh","-c",mand};
}
returnnewString[]{"cmd","/c",mand};
}
}
// 鐢ㄦ硶锛歊untime.getRuntime.exec("锻戒护");
String shpath="/test/test.sh"; //绋嫔簭璺寰
Process process =null;
String mand1 = 钬渃hmod 777 钬 + shpath;
try {
Runtime.getRuntime.exec(mand1 ).waitFor;
} catch (IOException e1) {
e1.printStackTrace;
}catch (InterruptedException e) {
e.printStackTrace;
}
String var="201102"; /鍙傛暟
String mand2 = 钬/bin/sh 钬 + shpath + 钬 钬 + var;
Runtime.getRuntime.exec(mand2).waitFor;
濡傛灉shell鑴氭湰鍜宩ava绋嫔簭杩愯屽湪涓嶅悓镄勬湇锷″櫒涓婏纴鍙浠ヤ娇鐢ㄨ繙绋嬫墽琛孡inux锻戒护镓ц屽寘锛屼娇鐢╯sh2鍗忚杩炴帴杩灭▼链嶅姟鍣锛屽苟鍙戦佹墽琛屽懡浠ゅ氨琛屼简锛実anymed.ssh2鐩稿叧mave閰岖疆濡备笅锛屼綘鍙浠ヨ嚜宸辩栌搴︽悳绱㈢浉鍏宠祫鏂欍
濡傛灉shell鑴氭湰鍜宩ava绋嫔簭鍦ㄥ悓涓鍙版湇锷″櫒涓婏纴
杩欓噷涓嶅缑涓嶆彁鍒癹ava镄刾rocess绫讳简銆
process杩欎釜绫绘槸涓涓鎶借薄绫伙纴灏佽呬简涓涓杩涚▼锛堜綘鍦ㄨ皟鐢╨inux镄勫懡浠ゆ垨钥却hell鑴氭湰灏辨槸涓轰简镓ц屼竴涓鍦╨inux涓嬫墽琛岀殑绋嫔簭锛屾墍浠ュ簲璇ヤ娇鐢╬rocess绫伙级銆
process绫绘彁渚涗简镓ц屼粠杩涚▼杈揿叆锛屾墽琛岃緭鍑哄埌杩涚▼锛岀瓑寰呰繘绋嫔畬鎴愶纴妫镆ヨ繘绋嬬殑鎺ㄥ嚭鐘舵侊纴浠ュ强shut down鎺夎繘绋嬨
.ganymed.ssh2
ganymed-ssh2-build
210
链鍦版墽琛屽懡浠や唬镰佸备笅锛
Stringshpath="/test/test.sh";//绋嫔簭璺寰
Processprocess=null;
Stringmand1=钬渃hmod777钬+shpath;
process=Runtime.getRuntime.exec(mand1);
process.waitFor;
1銆佹渶甯哥敤镄勬柟娉曪细
Processp=Runtime.getRuntime.exec(SHELL_FILE_DIR+RUNNING_SHELL_FILE+
""+param1+""+param2+""+param3);
intrunnngStatus=p.waitFor;
2銆侀氲繃ProcessBuilder杩涜岃皟搴︼纴杩欑嶆柟娉曟瘆杈幂洿瑙傦纴钥屼笖鍙傛暟镄勮剧疆涔熸瘆杈冩柟渚匡细
ProcessBuilderpb=newProcessBuilder("./"+RUNNING_SHELL_FILE,param1,
param2,param3);
pb.directory(newFile(SHELL_FILE_DIR));
intrunningStatus=0;
Strings=null;
try{
Processp=pb.start;
try{
runningStatus=p.waitFor;
}catch(InterruptedExceptione){
e.printStackTrace;
}
}catch(IOExceptione){
e.printStackTrace;
}
if(runningStatus!=0){
}
return;
鍙傛暟璇存槑锛
RUNNING_SHELL_FILE锛氲佽繍琛岀殑鑴氭湰
SHELL_FILE_DIR锛氲佽繍琛岀殑鑴氭湰镓鍦ㄧ殑鐩褰曪绂 褰撶劧浣犱篃鍙浠ユ妸瑕佽繍琛岀殑鑴氭湰鍐欐垚鍏ㄨ矾寰勚
runningStatus锛氲繍琛岀姸镐侊纴0镙囱瘑姝e父銆 璇︾粏鍙浠ョ湅java鏂囨。銆
param1, param2, param3锛氩彲浠ュ湪RUNNING_SHELL_FILE鑴氭湰涓鐩存帴阃氲繃1,1,2,$3鍒嗗埆𨰾垮埌镄勫弬鏁般
瀵逛簬绗涓涓闂棰桡细java鎶揿彇锛屽苟涓旀妸缁撴灉镓揿寘銆傞偅涔堟瘆杈幂洿鎺ョ殑锅氭硶灏辨槸锛宩ava鎺ユ敹钖勭嶆秷鎭锛坉b锛宫etaq绛夌瓑锛夛纴铹跺悗鍊熷姪浜巎storm闆嗙兢杩涜岃皟搴﹀拰鎶揿彇銆
链钖庢妸鎶揿彇镄勭粨鏋滀缭瀛桦埌涓涓鏂囦欢涓锛屽苟涓旈氲繃璋幂敤shell镓揿寘锛 锲炰紶銆 涔熻告湁钖屽︿细闂锛
涓轰粈涔堜笉鐩存帴鎶妀ava璋幂敤odps鐩存帴淇濆瓨鏂囦欢锛岀瓟妗堟槸锛屾垜浠镄勯泦缇や笉鏄痟z闆嗙兢锛岀洿鎺ヤ笂浼爋dps阃熷害寰堟湁闂棰桡纴锲犳ゅ厛镓揿寘姣旇缉钖堥伞傦纸杩欓噷涓岖籂缁撹捐′简锛屾垜浠锲炲埌姝i桡级
java璋幂敤shell镄勬柟娉
阃氲繃ProcessBuilder杩涜岃皟搴
杩欑嶆柟娉曟瘆杈幂洿瑙傦纴钥屼笖鍙傛暟镄勮剧疆涔熸瘆杈冩柟渚匡纴 姣斿傛垜鍦ㄥ疄璺典腑镄勪唬镰(鎴戦殣钘忎简閮ㄥ垎涓氩姟浠g爜)锛
ProcessBuilderpb = new ProcessBuilder("./" + RUNNING_SHELL_FILE, param1,
param2, param3);
pb.directory(new File(SHELL_FILE_DIR));
int runningStatus = 0;
String s = null;
try {
Process p = pb.start;
try {
runningStatus = p.waitFor;
} catch (InterruptedException e) {
}
} catch (IOException e) {
}
if (runningStatus != 0) {
}
return;
杩欓噷链夊繀瑕佽В閲娄竴涓嫔嚑涓鍙傛暟锛
RUNNING_SHELL_FILE锛氲佽繍琛岀殑鑴氭湰
SHELL_FILE_DIR锛氲佽繍琛岀殑鑴氭湰镓鍦ㄧ殑鐩褰曪绂 褰撶劧浣犱篃鍙浠ユ妸瑕佽繍琛岀殑鑴氭湰鍐欐垚鍏ㄨ矾寰勚
runningStatus锛氲繍琛岀姸镐侊纴0镙囱瘑姝e父銆 璇︾粏鍙浠ョ湅java鏂囨。銆
param1, param2, param3锛氩彲浠ュ湪RUNNING_SHELL_FILE鑴氭湰涓鐩存帴阃氲繃1,2,$3鍒嗗埆𨰾垮埌镄勫弬鏁般
鐩存帴阃氲繃绯荤粺Runtime镓ц宻hell
杩欎釜鏂规硶姣旇缉𨱌村姏锛屼篃姣旇缉甯哥敤锛 浠g爜濡备笅锛
p = Runtime.getRuntime.exec(SHELL_FILE_DIR + RUNNING_SHELL_FILE + " "+param1+" "+param2+" "+param3);
p.waitFor;
鎴戜滑鍙戠幇锛岄氲繃Runtime镄勬柟寮忓苟娌℃湁builder闾d箞鏂逛究锛岀壒鍒鏄鍙傛暟鏂归溃锛屽繀椤昏嚜宸卞姞绌烘牸鍒嗗紑锛屽洜涓篹xec浼氭妸鏁翠釜瀛楃︿覆浣滀负shell杩愯屻
鍙鑳藉瓨鍦ㄧ殑闂棰树互鍙婅В鍐虫柟娉
濡傛灉浣犺夊缑阃氲繃涓婇溃灏辫兘婊¤冻浣犵殑闇姹傦纴闾d箞鍙鑳芥槸瑕佺板佷简銆备綘浼氶亣鍒颁互涓嬫儏鍐点
娌℃潈闄愯繍琛
杩欎釜𨱍呭喌鎴戜滑锲㈤槦镄勬湵涓沧柟灏遍亣鍒颁简锛 鍦ㄥ仛DTS杩佺Щ镄勮繃绋嬩腑锛岃佹墽琛屽寘閲岄溃镄剆hell鑴氭湰锛 瑙e帇鍑烘潵浜嗕箣钖庯纴鍙戠幇镓ц屼笉浜嗐 闾d箞灏辨寜镦т笂闱㈢殑鏂规硶鎺堟潈钖
java杩涜屼竴鐩寸瓑寰却hell杩斿洖
杩欎釜闂棰树及璁℃洿锷犵粡甯搁亣鍒般 铡熷洜鏄锛 shell鑴氭湰涓链塭cho鎴栬卲rint杈揿嚭锛 瀵艰嚧缂揿啿鍖鸿鐢ㄥ畬浜! 涓轰简阆垮厤杩欑嶆儏鍐碉纴 涓瀹氲佹妸缂揿啿鍖鸿讳竴涓嬶纴 濂藉勫氨鏄锛屽彲浠ュ箂hell镄勫叿浣撹繍琛岀姸镐佽繘琛宭og鍑烘潵銆 姣斿备笂闱㈡垜镄勪緥瀛愪腑鎴戜细鍙樻垚锛
ProcessBuilderpb = new ProcessBuilder("./" + RUNNING_SHELL_FILE, keyword.trim,
taskId.toString, fileName);
pb.directory(new File(CASPERJS_FILE_DIR));
int runningStatus = 0;
String s = null;
try {
Process p = pb.start;
BufferedReaderstdInput = new BufferedReader(new InputStreamReader(p.getInputStream));
BufferedReaderstdError = new BufferedReader(new InputStreamReader(p.getErrorStream));
while ((s = stdInput.readLine) != null) {
LOG.error(s);
}
while ((s = stdError.readLine) != null) {
LOG.error(s);
}
try {
runningStatus = p.waitFor;
} catch (InterruptedException e) {
}
璁板缑鍦╯tart涔嫔悗锛 waitFor锛堬级涔嫔墠鎶婄紦鍐插尯璇诲嚭𨱒ユ墦log锛 灏卞彲浠ョ湅鍒颁綘镄剆hell涓轰粈涔堜细娌℃湁鎸夌収棰勬湡杩愯屻 杩欎釜杩樻湁涓涓濂藉勬槸锛屽彲浠ヨ籹hell閲岄溃杈揿嚭镄勭粨鏋滐纴 鏂逛究java浠g爜杩涗竴姝ユ搷浣溿
涔熻镐綘杩树细阆囧埌杩欎釜闂棰桡纴鏄庢槑镓嫔伐鍙浠ヨ繍琛岀殑锻戒护锛宩ava璋幂敤镄剆hell涓镆愪竴浜涘懡浠ゅ眳铹朵笉鑳芥墽琛岋纴鎶ラ敊锛氩懡浠や笉瀛桦湪锛
姣斿傛垜鍦ㄤ娇鐢╟asperjs镄勬椂鍊欙纴镓嫔伐铡绘墽琛宻hell鏄庢槑鏄鍙浠ユ墽琛岀殑锛屼絾鏄痡ava璋幂敤镄勬椂鍊欙纴鍙戠幇镐绘槸鍑洪敊銆
阃氲繃璇诲彇缂揿啿鍖哄氨鑳藉彂鐜伴敊璇镞ュ织浜嗐 鎴戝彂鐜板嵆渚胯嚜宸辨妸瀹夎呯殑casperjs镄刡in宸茬粡锷犲叆浜唒ath涓锛/etc/profile,
钖勭峛ashrc涓锛夎缮涓嶅熴 姣斿傦细
exportNODE_HOME="/home/admin/node"
exportCASPERJS_HOME="/home/admin/casperjs"
exportPHANTOMJS_HOME="/home/admin/phantomjs"
exportPATH=$PATH:$JAVA_HOME/bin:/root/bin:$NODE_HOME/bin:$CASPERJS_HOME/bin:$PHANTOMJS_HOME/bin
铡熸潵鏄锲犱负java鍦ㄨ皟鐢╯hell镄勬椂鍊欙纴榛樿ょ敤镄勬槸绯荤粺镄/bin/涓嬬殑鎸囦护銆傜壒鍒鏄浣犵敤root𨱒冮檺杩愯岀殑镞跺欍 杩欐椂鍊欙纴浣犺佸湪/bin涓嫔姞杞阈句简銆傞拡瀵规垜涓婇溃镄勪緥瀛愶纴灏辫佸湪/bin涓嫔姞杞阈撅细
ln -s /home/admin/casperjs/bin/casperjscasperjs;
ln -s /home/admin/node/bin/nodenode;
ln -s /home/admin/phantomjs/bin/phantomjsphantomjs;
杩欐牱锛岄梾棰桦氨鍙浠ヨВ鍐充简銆
濡傛灉鏄阃氲繃java璋幂敤shell杩涜屾墦鍖咃纴闾d箞瑕佹敞镒忚矾寰勭殑闂棰树简
锲犱负shell閲岄溃tar镄勫帇缂╁拰瑙e帇鍙涓嶈兘鐩存帴鍐欙细
tar -zcf /home/admin/data/result.tar.gz /home/admin/data/result
鐩存帴缁欎綘鎶ラ敊锛屽洜涓篓ar镄勫帇缂╂簮蹇呴’鍒拌矾寰勪笅闱锛 锲犳ゅ彲浠ュ啓鎴
tar -zcf /home/admin/data/result.tar.gz -C /home/admin/data/ result
濡傛灉鎴戠殑shell鏄鍦╦ar鍖呬腑镐庝箞锷烇纻
绛旀堟槸锛氲В铡嫔嚭𨱒ャ傚啀鎸夌収涓婇溃鎸囩ず杩涜屾搷浣溿傦纸1锛夋垒鍒拌矾寰
String jarPath = findClassJarPath(ClassLoaderUtil.class);
JarFiletopLevelJarFile = null;
try {
topLevelJarFile = new JarFile(jarPath);
Enumeration entries = topLevelJarFile.entries;
while (entries.hasMoreElements) {
JarEntryentry = entries.nextElement;
if (!entry.isDirectory entry.getName.endsWith(".sh")) {
瀵逛綘镄剆hell鏂囦欢杩涜屽勭悊
}
}
瀵规枃浠跺勭悊镄勬柟娉曞氨绠鍗曚简锛岀洿鎺touch涓涓涓存椂鏂囦欢锛岀劧钖庢妸鏁版嵁娴佸啓鍏ワ纴浠g爜锛
FileUtils.touch(tempjline);
tempjline.deleteOnExit;
FileOutputStreamfos = new FileOutputStream(tempjline);
IOUtils.(ClassLoaderUtil.class.getResourceAsStream(r), fos);
fos.close;
棣栧厛浣犲彲浠ョ栌搴︽悳涓涓 java Process 绫荤殑鐢ㄦ硶锛屽緢澶氩崥鏂囬兘链夎茶В銆
鍙﹀栨垜琛ュ厖涓涓嬫垜鍐崭娇鐢ㄨ繃绋嬩腑镄勪竴浜涚偣锛
process = Runtime.getRuntime.exec(new String[]{"/bin/sh","-c",shellContext});
鍏朵腑 shellContext 鏄痵hel鑴氭湰瀛楃︿覆
杩椤彞鎻愪氦镄勬椂鍊欙纴涓嶅皯鍗氭枃 exec涓鏄鐩存帴鎻愪氦shellContext銆
浣嗘槸瀵逛簬涓浜涘満鏅涓嶉傜敤锛屽彇鍑烘潵鏁版嵁璺熺洿鎺ヨ繍琛宻hell鑴氭湰链夊樊寮傦纴鍙浠ユ敼鎴愭垜杩欑嶅啓娉曘
镙囩撅细浣沧枃缁忓吀 涓娄竴绡囷细涓涓浜哄甫澶寸殑鎴愯 涓涓鐚澶村甫澶寸殑鎴愯 涓嬩竴绡囷细鎻忓啓闀垮煄镄勮鍙 鎻忓啓闀垮煄缇庢櫙镄勮鍙Ⅳ 如何用Java关闭一个进程
解决这个问题,要看这个进程是java程序自定义的进程,还是操作系统的进程,操作系统的进程,又可以分为windows进程和Linux进程
一、针对操作系统的进程:
1,首先java用户,要具有操作进程的权限
2. 针对windows操作系统的进程,比如QQ进程:
Stringcommand="taskkill/f/imQQ.exe";
Runtime.getRuntime().exec(command);
其中:taskkill 是命令名称,/f /im 是参数,QQ.exe是进程的可执行文件。
3.针对Linux操作系统
Stringcommand="kill/f/imQQ.exe";
Runtime.getRuntime().exec(command);
二、在Java程序中自定义的进程
思路:在线程中设置一个标志变量,当这个变量的值在外界被改变的时候,有机会结束运行的线程
publicclassT{
publicstaticvoidmain(String[]args){
//启动线程
MyThreadthread=newMyThread();
newThread(thread).start();
//你的其它的工作,此时线程在运行中
//你不想让线程干活了,停掉它
//注意,这只是一个标志,具体线程何时停,并不能精确控制
thread.allDone=true;
}
}
{
booleanvolatileallDone=false;
publicvoidrun(){
//每次循环都检测标志
//如果设置停止标志时已经在循环里
//则最长需要等待一个循环的时间才能终止
while(!allDone){
//循环里的工作
}
}
}
Ⅵ java中如何执行命令行语句
可以使用java.lang.Process和java.lang.Runtime实现,下面展示两个例子,其它用法请查阅资料:
1、执行ping命令:
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
publicclassProcessTest{
publicstaticvoidmain(String[]args){
BufferedReaderbr=null;
try{
Stringcmd="ping127.0.0.1";
//执行dos命令并获取输出结果
Processproc=Runtime.getRuntime().exec(cmd);
br=newBufferedReader(newInputStreamReader(proc.getInputStream(),"GBK"));
Stringline;
while((line=br.readLine())!=null){
System.out.println(line);
}
proc.waitFor();
}catch(IOExceptione){
e.printStackTrace();
}catch(InterruptedExceptione){
e.printStackTrace();
}finally{
if(br!=null){
try{
br.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
}
2、打开浏览器并跳转到网络首页:
importjava.io.IOException;
publicclassProcessTest{
publicstaticvoidmain(String[]args){
try{
StringexeFullPathName="C:/ProgramFiles/InternetExplorer/IEXPLORE.EXE";
Stringmessage="www..com";
String[]cmd={exeFullPathName,message};
Processproc=Runtime.getRuntime().exec(cmd);
}catch(IOExceptione){
e.printStackTrace();
}
}
}