本文目錄一覽:
- 1、怎麼用java代碼運行linux命令
- 2、如何在java程序中調用linux命令或者shell腳本
- 3、java中如何執行linux命令
- 4、java程序里調用linux命令
- 5、如何用Java寫代碼連上Linux主機去在主機上執行命令
怎麼用java代碼運行linux命令
以下方法支持Linux和windows兩個系統的命令行調用。還用到了apache的lang工具包commons-lang3-3.1.jar來判斷操作系統類型、也用到了和log4j-1.2.16.jar來列印日誌。至於rm -rf 是否能成功刪除文件,可以手動去調用命令行試試。
private String callCmd(String cmd) throws InterruptedException, UnHandledOSException, ExecuteException {
if(SystemUtils.IS_OS_LINUX){
try {
// 使用Runtime來執行command,生成Process對象
Process process = Runtime.getRuntime().exec(
new String[] { “/bin/sh”, “-c”, cmd });
int exitCode = process.waitFor();
// 取得命令結果的輸出流
InputStream is = process.getInputStream();
// 用一個讀輸出流類去讀
InputStreamReader isr = new InputStreamReader(is);
// 用緩衝器讀行
BufferedReader br = new BufferedReader(isr);
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
System.out.println(line);
sb.append(line);
}
is.close();
isr.close();
br.close();
return sb.toString();
} catch (java.lang.NullPointerException e) {
System.err.println(“NullPointerException ” + e.getMessage());
logger.error(cmd);
} catch (java.io.IOException e) {
System.err.println(“IOException ” + e.getMessage());
}
throw new ExecuteException(cmd + “執行出錯!”);
}
if(SystemUtils.IS_OS_WINDOWS){
Process process;
try {
//process = new ProcessBuilder(cmd).start();
String[] param_array = cmd.split(“[\\s]+”);
ProcessBuilder pb = new ProcessBuilder(param_array);
process = pb.start();
/*process=Runtime.getRuntime().exec(cmd);*/
int exitCode = process.waitFor();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
System.out.println(line);
sb.append(line);
}
is.close();
isr.close();
br.close();
return sb.toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
throw new ExecuteException(cmd + “執行出錯!”);
}
throw new UnHandledOSException(“不支持本操作系統”);
}
如何在java程序中調用linux命令或者shell腳本
做到這,主要依賴2個類:Process和Runtime。
首先看一下Process類:
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,因為有些本機平台僅針對標準輸入和輸出流提供有限的緩衝區大小,如果讀寫子進程的輸出流或輸入流迅速出現失敗,
則可能導致子進程阻塞,甚至產生死鎖
abstract void destroy()
殺掉子進程。
abstract int exitValue()
返回子進程的出口值。根據慣例,值0表示正常終止。
abstract InputStream getErrorStream()
獲取子進程的錯誤流。
abstract InputStream getInputStream()
獲取子進程的輸入流。
abstract OutputStream getOutputStream()
獲取子進程的輸出流。
abstract int waitFor()
導致當前線程等待,如有必要,一直要等到由該 Process 對象表示的進程已經終止。
如果已終止該子進程,此方法立即返回。如果沒有終止該子進程,調用的線程將被阻塞,直到退出子進程。
特別需要注意:如果子進程中的輸入流,輸出流或錯誤流中的內容比較多,最好使用緩存(注意上面的情況2)
再來看一下Runtime類:
每個Java應用程序都有一個Runtime類實例,使應用程序能夠與其運行的環境相連接。可以通過getRuntime方法獲取當前運行時環境。
應用程序不能創建自己的Runtime類實例。
介紹幾個主要方法:
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下執行):
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腳本如下:
#!/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;
特別需要注意的是,當需要執行的linux命令帶有管道符時(例如:ps -ef|grep java),用上面的方法是不行的,解決方式是將需要執行的命令作為參數傳給shell
public class Test {
public static void main(String[] args) throws Exception{
String[] cmds = {“/bin/sh”,”-c”,”ps -ef|grep java”};
Process pro = Runtime.getRuntime().exec(cmds);
pro.waitFor();
InputStream in = pro.getInputStream();
BufferedReader read = new BufferedReader(new InputStreamReader(in));
String line = null;
while((line = read.readLine())!=null){
System.out.println(line);
}
}
}
PS:
Runtime.getRuntime().exec()這種調用方式在java虛擬機中是十分消耗資源的,即使命令可以很快的執行完畢,頻繁的調用時創建進程消耗十分客觀。
java虛擬機執行這個命令的過程是,首先克隆一條和當前虛擬機擁有一樣環境變數的進程,再用這個新的進程執行外部命令,最後退出這個進程。頻繁的創建對CPU和內存的消耗很大。
java中如何執行linux命令
執行linux命令基,基本思路是從控制台獲得輸入的指令,啟動命令行執行命令,捕捉異常,示例如下:
public class TestRunTime {
public static void main(String[] args) throws IOException, InterruptedException {
String cmd = “”;
if(args == null || args.length == 0){
System.out.println(“請輸入命令行參數”);
}else{
for(int i=0;iargs.length; i++){//獲得輸入的命令
cmd += args[i] + ” “;
}
}
try {
Process process = Runtime.getRuntime().exec(cmd);//執行命令
InputStreamReader ir = new InputStreamReader(process.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
String line;
while ((line = input.readLine()) != null) {//輸出結果
System.out.println(line);
}
} catch (java.io.IOException e) {
System.err.println(“IOException ” + e.getMessage());//捕捉異常
}
}
}
java程序里調用linux命令
1.Java調用shell
Java語言以其跨平台性和簡易性而著稱,在Java裡面的lang包里(java.lang.Runtime)提供了一個允許Java程序與該程序所運
行的環境交互的介面,這就是Runtime類,在Runtime類里提供了獲取當前運行環境的介面。
其中的exec函數返回一個執行shell命令的子進程。exec函數的具體實現形式有以下幾種:
public Process exec(String command) throws IOException
public Process exec(String command,String[] envp) throws
IOException
public Process exec(String command,String[] envp,File dir) throws
IOException
public Process exec(String[] cmdarray) throws IOException
public Process exec(String[] cmdarray, String[] envp) throws
IOException
public Process exec(String[] cmdarray, String[] envp,File dir)
throws IOException
我們在這裡主要用到的是第一個和第四個函數,具體方法很簡單,就是在exec函數中傳遞一個代表命令的字元串。exec函數返回的是一個Process類
型的類的實例。Process類主要用來控制進程,獲取進程信息等作用。(具體信息及其用法請參看Java doc)。
1)執行簡單的命令的方法:
代碼如下:
上面的代碼首先是聲明了一個代表命令的字元串commands,它代表了ls -l
這個命令。之後我們用Runtime.getRuntime().exec(commands)來生成一個子進程來執行這個命令,如果這句話運行成功,則
命令 ls -l 運行成功(由於沒有讓它顯示,不會顯示ls -l
的結果)。後面的流操作則是獲取進程的流信息,並把它們一行行輸出到屏幕。2)執行帶有參數的命令(尤其是參數需要用引號的)時則需要用String的數組來表示整個命令,而且要用轉義符把引號的特殊含義去除,例如我們要執行
find / -name “*mysql*” -print 時,用如下代碼
Java 可以通過 Runtime 調用Linux命令,形式如下:
Runtime.getRuntime().exec(command)
但是這樣執行時沒有任何輸出,因為調用 Runtime.exec 方法將產生一個本地的進程,並返回一個Process子類的實例(注意:Runtime.getRuntime().exec(command)返回的是一個Process類的實例)該實例可用於控制進程或取得進程的相關信息。
由於調用 Runtime.exec 方法所創建的子進程沒有自己的終端或控制台,因此該子進程的標準IO(如stdin,stdou,stderr)都通過 Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream() 方法重定向給它的父進程了。
用戶需要用這些stream來向子進程輸入數據或獲取子進程的輸出,下面的代碼可以取到 linux 命令的執行結果:
如何用Java寫代碼連上Linux主機去在主機上執行命令
其實不難,給你思路如下:
第一,你需要在遠程Linux主機上面裝好一個接收端程序,這個程序可以是java寫的,也可以是C語言寫的,都無所謂,因為網路介面是一樣的,都是socket。
如果你要用java寫,那需要在Linux上面把jdk裝上,推薦你用C寫,更容易操作linux執行cmd命令.
假設從主機A,檢查主機B上的進程,
需要在主機B上建立檢查用戶,例如叫x,
並設置通過public key認證登錄SSH,不會可以google搜一下,
然後,在A機器上執行:
ssh x@B ~/command.sh result.txt
command.sh就是B機器上放置在x目錄下的腳本。
輸出結果應該是寫到了result.txt
或者另一種寫法
result=`ssh x@B ~/command.sh`
結果直接保存到result變數中了。
暫時沒有linux環境,所以沒有實際測試,你自己試試吧
原創文章,作者:LIYO,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/131414.html