java执行linux命令
生活随笔
收集整理的這篇文章主要介紹了
java执行linux命令
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉:java程序中要執行linux命令主要依賴2個類:Process和Runtime
首先看一下Process類:
[plain] view plaincopy
ProcessBuilder.start() 和 Runtime.exec 方法創建一個本機進程,并返回 Process 子類的一個實例,?
該實例可用來控制進程并獲得相關信息。Process 類提供了執行從進程輸入、執行輸出到進程、等待進程完成、?
檢查進程的退出狀態以及銷毀(殺掉)進程的方法。?
創建進程的方法可能無法針對某些本機平臺上的特定進程很好地工作,比如,本機窗口進程,守護進程,Microsoft Windows?
上的 Win16/DOS 進程,或者 shell 腳本。創建的子進程沒有自己的終端或控制臺。它的所有標準 io(即 stdin、stdout 和 stderr)?
操作都將通過三個流 (getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父進程。?
父進程使用這些流來提供到子進程的輸入和獲得從子進程的輸出。因為有些本機平臺僅針對標準輸入和輸出流提供有限的緩沖區大小,?
如果讀寫子進程的輸出流或輸入流迅速出現失敗,則可能導致子進程阻塞,甚至產生死鎖。?
當沒有 Process 對象的更多引用時,不是刪掉子進程,而是繼續異步執行子進程。?
對于帶有 Process 對象的 Java 進程,沒有必要異步或并發執行由 Process 對象表示的進程。?
特別需要注意的是:
1,創建的子進程沒有自己的終端控制臺,所有標注操作都會通過三個流
(getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父進程(父進程可通過這些流判斷子進程的執行情況)
2,因為有些本機平臺僅針對標準輸入和輸出流提供有限的緩沖區大小,如果讀寫子進程的輸出流或輸入流迅速出現失敗,
則可能導致子進程阻塞,甚至產生死鎖
[plain] view plaincopy
abstract? void destroy()??
????????? 殺掉子進程。??
abstract? int exitValue()??
????????? 返回子進程的出口值。根據慣例,值0表示正常終止。??
abstract? InputStream getErrorStream()??
????????? 獲取子進程的錯誤流。??
abstract? InputStream getInputStream()??
????????? 獲取子進程的輸入流。??
abstract? OutputStream getOutputStream()??
????????? 獲取子進程的輸出流。??
abstract? int waitFor()??
????????? 導致當前線程等待,如有必要,一直要等到由該 Process 對象表示的進程已經終止。?
???? 如果已終止該子進程,此方法立即返回。如果沒有終止該子進程,調用的線程將被阻塞,直到退出子進程。?
特別需要注意:如果子進程中的輸入流,輸出流或錯誤流中的內容比較多,最好使用緩存(注意上面的情況2)
再來看一下Runtime類:
[plain] view plaincopy
每個Java應用程序都有一個Runtime類實例,使應用程序能夠與其運行的環境相連接。可以通過getRuntime方法獲取當前運行時環境。??
應用程序不能創建自己的Runtime類實例。??
介紹幾個主要方法:
[plain] view plaincopy
Process exec(String command)??
???????? 在單獨的進程中執行指定的字符串命令。?
Process exec(String command, String[] envp)??
???????? 在指定環境的單獨進程中執行指定的字符串命令。?
Process exec(String command, String[] envp, File dir)??
???????? 在有指定環境和工作目錄的獨立進程中執行指定的字符串命令。?
Process exec(String[] cmdarray)??
???????? 在單獨的進程中執行指定命令和變量。??
Process exec(String[] cmdarray, String[] envp)??
???????? 在指定環境的獨立進程中執行指定命令和變量。??
Process exec(String[] cmdarray, String[] envp, File dir)??
???????? 在指定環境和工作目錄的獨立進程中執行指定的命令和變量。??
command: 一條指定的系統命令。
envp:環境變量字符串數組,其中每個環境變量的設置格式為name=value;如果子進程應該繼承當前進程的環境,則該參數為null。
dir:子進程的工作目錄;如果子進程應該繼承當前進程的工作目錄,則該參數為null。
cmdarray:包含所調用命令及其參數的數組。
以下為示例(要打成可執行jar包扔到linux下執行):
[java] view plaincopy
public class test {?
??? public static void main(String[] args){?
??????? InputStream in = null;?
??????? try {?
??????????? Process pro = Runtime.getRuntime().exec(new String[]{"sh",?
???????????????????????????????????? "/home/test/test.sh","select admin from M_ADMIN",?
???????????????????????????????????? "/home/test/result.txt"});?
??????????? pro.waitFor();?
??????????? in = pro.getInputStream();?
??????????? BufferedReader read = new BufferedReader(new InputStreamReader(in));?
??????????? String result = read.readLine();?
??????????? System.out.println("INFO:"+result);?
??????? } catch (Exception e) {?
??????????? e.printStackTrace();?
??????? }?
??? }?
}?
在這用的是Process exec(String[] cmdarray)這個方法
/home/test/test.sh腳本如下:
[plain] view plaincopy
#!/bin/sh?
?
#查詢sql?
SQL=$1?
#查詢結果保存文件?
RESULT_FILE=$2?
#數據庫連接?
DB_NAME=scott?
DB_PWD=tiger?
DB_SERVER=DB_TEST?
?
RESULT=`sqlplus -S ${DB_NAME}/${DB_PWD}@${DB_SERVER}<< !??
set heading off?
set echo off?
set pages 0?
set feed off?
set linesize 3000?
${SQL}?
/?
commit?
/?
!`?
?????
echo "${RESULT}" >> ${RESULT_FILE}?
echo 0;?
引用
首先看一下Process類:
[plain] view plaincopy
ProcessBuilder.start() 和 Runtime.exec 方法創建一個本機進程,并返回 Process 子類的一個實例,?
該實例可用來控制進程并獲得相關信息。Process 類提供了執行從進程輸入、執行輸出到進程、等待進程完成、?
檢查進程的退出狀態以及銷毀(殺掉)進程的方法。?
創建進程的方法可能無法針對某些本機平臺上的特定進程很好地工作,比如,本機窗口進程,守護進程,Microsoft Windows?
上的 Win16/DOS 進程,或者 shell 腳本。創建的子進程沒有自己的終端或控制臺。它的所有標準 io(即 stdin、stdout 和 stderr)?
操作都將通過三個流 (getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父進程。?
父進程使用這些流來提供到子進程的輸入和獲得從子進程的輸出。因為有些本機平臺僅針對標準輸入和輸出流提供有限的緩沖區大小,?
如果讀寫子進程的輸出流或輸入流迅速出現失敗,則可能導致子進程阻塞,甚至產生死鎖。?
當沒有 Process 對象的更多引用時,不是刪掉子進程,而是繼續異步執行子進程。?
對于帶有 Process 對象的 Java 進程,沒有必要異步或并發執行由 Process 對象表示的進程。?
特別需要注意的是:
1,創建的子進程沒有自己的終端控制臺,所有標注操作都會通過三個流
(getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父進程(父進程可通過這些流判斷子進程的執行情況)
2,因為有些本機平臺僅針對標準輸入和輸出流提供有限的緩沖區大小,如果讀寫子進程的輸出流或輸入流迅速出現失敗,
則可能導致子進程阻塞,甚至產生死鎖
[plain] view plaincopy
abstract? void destroy()??
????????? 殺掉子進程。??
abstract? int exitValue()??
????????? 返回子進程的出口值。根據慣例,值0表示正常終止。??
abstract? InputStream getErrorStream()??
????????? 獲取子進程的錯誤流。??
abstract? InputStream getInputStream()??
????????? 獲取子進程的輸入流。??
abstract? OutputStream getOutputStream()??
????????? 獲取子進程的輸出流。??
abstract? int waitFor()??
????????? 導致當前線程等待,如有必要,一直要等到由該 Process 對象表示的進程已經終止。?
???? 如果已終止該子進程,此方法立即返回。如果沒有終止該子進程,調用的線程將被阻塞,直到退出子進程。?
特別需要注意:如果子進程中的輸入流,輸出流或錯誤流中的內容比較多,最好使用緩存(注意上面的情況2)
再來看一下Runtime類:
[plain] view plaincopy
每個Java應用程序都有一個Runtime類實例,使應用程序能夠與其運行的環境相連接。可以通過getRuntime方法獲取當前運行時環境。??
應用程序不能創建自己的Runtime類實例。??
介紹幾個主要方法:
[plain] view plaincopy
Process exec(String command)??
???????? 在單獨的進程中執行指定的字符串命令。?
Process exec(String command, String[] envp)??
???????? 在指定環境的單獨進程中執行指定的字符串命令。?
Process exec(String command, String[] envp, File dir)??
???????? 在有指定環境和工作目錄的獨立進程中執行指定的字符串命令。?
Process exec(String[] cmdarray)??
???????? 在單獨的進程中執行指定命令和變量。??
Process exec(String[] cmdarray, String[] envp)??
???????? 在指定環境的獨立進程中執行指定命令和變量。??
Process exec(String[] cmdarray, String[] envp, File dir)??
???????? 在指定環境和工作目錄的獨立進程中執行指定的命令和變量。??
command: 一條指定的系統命令。
envp:環境變量字符串數組,其中每個環境變量的設置格式為name=value;如果子進程應該繼承當前進程的環境,則該參數為null。
dir:子進程的工作目錄;如果子進程應該繼承當前進程的工作目錄,則該參數為null。
cmdarray:包含所調用命令及其參數的數組。
以下為示例(要打成可執行jar包扔到linux下執行):
[java] view plaincopy
public class test {?
??? public static void main(String[] args){?
??????? InputStream in = null;?
??????? try {?
??????????? Process pro = Runtime.getRuntime().exec(new String[]{"sh",?
???????????????????????????????????? "/home/test/test.sh","select admin from M_ADMIN",?
???????????????????????????????????? "/home/test/result.txt"});?
??????????? pro.waitFor();?
??????????? in = pro.getInputStream();?
??????????? BufferedReader read = new BufferedReader(new InputStreamReader(in));?
??????????? String result = read.readLine();?
??????????? System.out.println("INFO:"+result);?
??????? } catch (Exception e) {?
??????????? e.printStackTrace();?
??????? }?
??? }?
}?
在這用的是Process exec(String[] cmdarray)這個方法
/home/test/test.sh腳本如下:
[plain] view plaincopy
#!/bin/sh?
?
#查詢sql?
SQL=$1?
#查詢結果保存文件?
RESULT_FILE=$2?
#數據庫連接?
DB_NAME=scott?
DB_PWD=tiger?
DB_SERVER=DB_TEST?
?
RESULT=`sqlplus -S ${DB_NAME}/${DB_PWD}@${DB_SERVER}<< !??
set heading off?
set echo off?
set pages 0?
set feed off?
set linesize 3000?
${SQL}?
/?
commit?
/?
!`?
?????
echo "${RESULT}" >> ${RESULT_FILE}?
echo 0;?
| ? |
轉載于:https://www.cnblogs.com/shhaoran/archive/2013/02/17/2924412.html
總結
以上是生活随笔為你收集整理的java执行linux命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ORA-01180: can not c
- 下一篇: linux C 进程内部存储管理