java 執行作業系統命令
java 執行作業系統命令,包括輸出資訊的獲取和超時判斷
package com.ctoc.web.msgtools.smtplog;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class CommandRunner {
private StringBuilder rsBuilder;
private StringBuilder errBuilder;
public static final String LINE_SEPARATOR = System.getProperty("line.separator");
private long timeout = 1000 * 60 * 5;//5分鐘
private Process p = null;
private String command;
public String runCommand(String command) throws CommandException {
this.command = command;
if (command == null || command.trim().length() == 0) {
throw new CommandException("command is null or empty!");
}
// Start up the process
try {
p = Runtime.getRuntime().exec(command);
} catch (IOException e) {
e.printStackTrace();
throw new CommandException(e.getMessage());
}
this.errBuilder = new StringBuilder();
this.rsBuilder = new StringBuilder();
Thread tIn = new CommandOutputStreamReadThread( p.getInputStream(),false);
Thread tErr = new CommandOutputStreamReadThread( p.getErrorStream(),true);
//超時檢查
Thread tCheck = new TimeOutCheckThread();
tIn.start();
tErr.start();
tCheck.start();
// Wait for it to finish running
try {
p.waitFor();
tIn.join();
tErr.join();
tCheck.stop();
} catch (InterruptedException ie) {
System.out.println(ie);
}
// Check the return code
// ok=0;
int ret = p.exitValue();
if(ret != 0){
throw new CommandException("execute fail:" + command
+LINE_SEPARATOR +
this.errBuilder.toString());
}
return rsBuilder.toString();
}
public void stopRun(){
if(p != null){
System.err.println("destroy process of command:" + command);
p.destroy();
}
}
/**
* 命令輸出結果獲取執行緒
* @author qking
*
*/
class CommandOutputStreamReadThread extends Thread {
private InputStream is;
private boolean errorStream;
CommandOutputStreamReadThread(InputStream is, boolean errorStream) {
this.is = is;
this.errorStream = errorStream;
}
@Override
public void run() {
StringBuilder sb;
if(errorStream){
sb = errBuilder;
}else{
sb = rsBuilder;
}
InputStreamReader isr = new InputStreamReader(is);
BufferedReader reader = new BufferedReader(isr);
String s;
try {
while ((s = reader.readLine()) != null) {
if (s.length() != 0) {
sb.append(s);
sb.append(LINE_SEPARATOR);
try {
Thread.sleep(10);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
/**
* 檢查操作超時執行緒
* @author qking
*
*/
class TimeOutCheckThread extends Thread{
@Override
public void run() {
//-1時不進行超時判斷
if(timeout == -1){
return;
}
try{
this.sleep(timeout);
}catch(InterruptedException ie){
ie.printStackTrace();
}
stopRun();
}
}
public static void main(String[] args) throws Exception {
CommandRunner cr = new CommandRunner();
System.out.println(cr.runCommand("test.bat"));
}
public long getTimeout() {
return timeout;
}
public void setTimeout(long timeout) {
this.timeout = timeout;
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class CommandRunner {
private StringBuilder rsBuilder;
private StringBuilder errBuilder;
public static final String LINE_SEPARATOR = System.getProperty("line.separator");
private long timeout = 1000 * 60 * 5;//5分鐘
private Process p = null;
private String command;
public String runCommand(String command) throws CommandException {
this.command = command;
if (command == null || command.trim().length() == 0) {
throw new CommandException("command is null or empty!");
}
// Start up the process
try {
p = Runtime.getRuntime().exec(command);
} catch (IOException e) {
e.printStackTrace();
throw new CommandException(e.getMessage());
}
this.errBuilder = new StringBuilder();
this.rsBuilder = new StringBuilder();
Thread tIn = new CommandOutputStreamReadThread( p.getInputStream(),false);
Thread tErr = new CommandOutputStreamReadThread( p.getErrorStream(),true);
//超時檢查
Thread tCheck = new TimeOutCheckThread();
tIn.start();
tErr.start();
tCheck.start();
// Wait for it to finish running
try {
p.waitFor();
tIn.join();
tErr.join();
tCheck.stop();
} catch (InterruptedException ie) {
System.out.println(ie);
}
// Check the return code
// ok=0;
int ret = p.exitValue();
if(ret != 0){
throw new CommandException("execute fail:" + command
+LINE_SEPARATOR +
this.errBuilder.toString());
}
return rsBuilder.toString();
}
public void stopRun(){
if(p != null){
System.err.println("destroy process of command:" + command);
p.destroy();
}
}
/**
* 命令輸出結果獲取執行緒
* @author qking
*
*/
class CommandOutputStreamReadThread extends Thread {
private InputStream is;
private boolean errorStream;
CommandOutputStreamReadThread(InputStream is, boolean errorStream) {
this.is = is;
this.errorStream = errorStream;
}
@Override
public void run() {
StringBuilder sb;
if(errorStream){
sb = errBuilder;
}else{
sb = rsBuilder;
}
InputStreamReader isr = new InputStreamReader(is);
BufferedReader reader = new BufferedReader(isr);
String s;
try {
while ((s = reader.readLine()) != null) {
if (s.length() != 0) {
sb.append(s);
sb.append(LINE_SEPARATOR);
try {
Thread.sleep(10);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
/**
* 檢查操作超時執行緒
* @author qking
*
*/
class TimeOutCheckThread extends Thread{
@Override
public void run() {
//-1時不進行超時判斷
if(timeout == -1){
return;
}
try{
this.sleep(timeout);
}catch(InterruptedException ie){
ie.printStackTrace();
}
stopRun();
}
}
public static void main(String[] args) throws Exception {
CommandRunner cr = new CommandRunner();
System.out.println(cr.runCommand("test.bat"));
}
public long getTimeout() {
return timeout;
}
public void setTimeout(long timeout) {
this.timeout = timeout;
}
}
相關文章
- Python 執行 Linux 作業系統命令PythonLinux作業系統
- 在PL/SQL中執行作業系統命令SQL作業系統
- 在sqlplus執行作業系統命令SQL作業系統
- 在PL/SQL中執行作業系統的命令SQL作業系統
- 作業系統-執行緒作業系統執行緒
- Java程式執行系統命令Java
- 利用oracle儲存過程執行作業系統命令Oracle儲存過程作業系統
- paramiko執行多個作業系統命令並返回作業系統
- 作業系統:多執行緒作業系統執行緒
- 作業系統何時執行?作業系統
- sqlplus小竅門:執行作業系統命令(zt)SQL作業系統
- Java 執行緒和作業系統的執行緒有啥區別?Java執行緒作業系統
- 【作業系統】程式與執行緒作業系統執行緒
- 作業系統的執行環境作業系統
- 作業系統中的執行緒種類作業系統執行緒
- 作業系統(4)執行緒及其實現作業系統執行緒
- 作業系統中的程式與執行緒作業系統執行緒
- 【作業系統】1.程序和執行緒作業系統執行緒
- Linux作業系統執行級別介紹Linux作業系統
- 作業系統-執行緒和程式的區別作業系統執行緒
- 作業系統_程式和執行緒的區別作業系統執行緒
- 作業系統——深入理解程式和執行緒作業系統執行緒
- 作業系統複習(程式、執行緒、死鎖)作業系統執行緒
- 作業系統的程式/執行緒同步問題作業系統執行緒
- Linux作業系統 paste命令Linux作業系統AST
- Java識別作業系統Java作業系統
- 作業系統學習(六)—— 執行緒概念及特點,作業系統的併發機制作業系統執行緒
- java程式在windows系統作為服務程式執行JavaWindows
- Python執行作業系統命令並取得返回值和退出碼,支援有互信的遠端執行Python作業系統
- AIX命令集錦六(自動執行作業命令)AI
- 【作業系統】程式的描述與控制[執行緒](4)作業系統執行緒
- 無需作業系統直接執行 Python 程式碼作業系統Python
- 第二章 作業系統的執行機制作業系統
- 10.19:xshell、作業系統、系統命令作業系統
- 使用 ABAP 程式語言直接執行 ABAP 伺服器所在作業系統的 shell 命令伺服器作業系統
- UNIX作業系統中常用的命令作業系統
- Node.js執行系統命令Node.js
- Linux系統執行命令方法Linux