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作業系統
- Java程式執行系統命令Java
- paramiko執行多個作業系統命令並返回作業系統
- 作業系統-執行緒作業系統執行緒
- 作業系統:多執行緒作業系統執行緒
- Java 執行緒和作業系統的執行緒有啥區別?Java執行緒作業系統
- 【作業系統】程式與執行緒作業系統執行緒
- 作業系統的執行環境作業系統
- 10.19:xshell、作業系統、系統命令作業系統
- Linux作業系統 paste命令Linux作業系統AST
- 作業系統中的執行緒種類作業系統執行緒
- Linux作業系統執行級別介紹Linux作業系統
- 【作業系統】1.程序和執行緒作業系統執行緒
- Linux系統執行命令方法Linux
- Python執行作業系統命令並取得返回值和退出碼,支援有互信的遠端執行Python作業系統
- 作業系統——深入理解程式和執行緒作業系統執行緒
- 作業系統-執行緒和程式的區別作業系統執行緒
- 作業系統複習(程式、執行緒、死鎖)作業系統執行緒
- 作業系統_程式和執行緒的區別作業系統執行緒
- Node.js執行系統命令Node.js
- Python-呼叫執行系統命令Python
- 使用 ABAP 程式語言直接執行 ABAP 伺服器所在作業系統的 shell 命令伺服器作業系統
- 【作業系統】程式的描述與控制[執行緒](4)作業系統執行緒
- 第二章 作業系統的執行機制作業系統
- Java執行cmd命令Java
- 作業系統知識回顧(2)--程式與執行緒作業系統執行緒
- LINUX作業系統知識:程式與執行緒詳解Linux作業系統執行緒
- 【Dr.Chen的計算機作業系統】Java多執行緒的實現操作計算機作業系統Java執行緒
- Powershell 命令列安裝 Windows 作業系統命令列Windows作業系統
- 作業系統(1)——作業系統概述作業系統
- 作業系統(一):作業系統概述作業系統
- 程式,核心執行緒,使用者執行緒,協程,纖程......作業系統世界觀執行緒作業系統
- 作業系統(二):作業系統結構作業系統
- python執行系統命令四種方法比較Python
- 實現ARM+ROS(機器人作業系統)之執行ROS!ROS機器人作業系統
- 作業系統 作業5作業系統
- 作業系統2—作業系統概論(下)作業系統
- 作業系統1—作業系統概論(上)作業系統