⑴ java 調用 shell 腳本
在寫程序時,有時需要在java程序中調用shell腳本,可以通過Runtime的exec方法來調用shell程序,運行腳本。每個Java 應用程序都有一個Runtime 類實例,使應用程序能夠與其運行的環境相連接。通過Runtime對象可以返回運行環境的情況,包括CPU數,虛擬機內存大小等,並能夠通過exec方法調用執行命令。可以通過getRuntime 方法獲取當前Runtime實例。 public boolean ExeShell(){ Runtime rt = Runtime.getRuntime(); try { Process p = rt.exec(checkShellName); if(p.waitFor() != 0) return false; } catch (IOException e) { SysLog.error("沒有找到檢測腳本"); return false; } catch (InterruptedException e) { e.printStackTrace(); return false; } return true; } 其中p.waitFor()語句用來等待子進程結束,其返回值為進程結束退出碼。
⑵ 如何在java程序中調用linux命令或者shell腳本
這里不得不提到java的process類了。
process這個類是一個抽象類,封裝了一個進程(你在調用linux的命令或者shell腳本就是為了執行一個在linux下執行的程序,所以應該使用process類)。
process類提供了執行從進程輸入,執行輸出到進程,等待進程完成,檢查進程的推出狀態,以及shut down掉進程。
至於詳細的process類的介紹放在以後介紹。
另外還要注意一個類:Runtime類,Runtime類是一個與JVM運行時環境有關的類,這個類是Singleton的。
這里用到的Runtime.getRuntime()方法是取得當前JVM的運行環境,也是java中唯一可以得到運行環境的方法。(另外,Runtime的大部分方法都是實例方法,也就是說每次運行調用的時候都需要調用到getRuntime方法)
下面說說Runtime的exec()方法,這里要注意的有一點,就是public Process exec(String [] cmdArray, String [] envp);這個方法中cmdArray是一個執行的命令和參數的字元串數組,數組的第一個元素是要執行的命令往後依次都是命令的參數,envp感覺應該和C中的execve中的環境變數是一樣的,envp中使用的是name=value的方式。
下面說一下,如何使用process來調用shell腳本
例如,我需要在linux下實行linux命令:sh test.sh,下面就是執行test.sh命令的方法:
這個var參數就是日期這個201102包的名字。
String shpath="/test/test.sh"; //程序路徑
Process process =null;
String command1 = 「chmod 777 」 + shpath;
process = Runtime.getRuntime().exec(command1);
process.waitFor();
String var="201102"; //參數
String command2 = 「/bin/sh 」 + shpath + 」 」 + var;
Runtime.getRuntime().exec(command2).waitFor();
注意:
1
我為什麼要使用 chmod 777命令呢?在有的機器上面,可能沒有設置許可權問題。這是你在linux下面執行shell腳本需要注意的問題。沒有的話,就需要添加許可權,就用chmod 777,否則在執行到Runtime.getRuntime().exec的時侯會出現Permission denied錯誤。
2
waitFor()這個也是必不可缺的,如果你需要執行多行命令的話,把waitFor()這個加上。
⑶ linux shell腳本如何啟動一個java進程
在shell裡面直接調用即可。
1,編譯一個java文件為a.class。
2,編寫shell腳本b .sh 。
#!/bin/bash
javaa.class
3,放在同一目錄下運行shell即可。如果要後台運行,bash b.sh&
⑷ 如何在java程序中調用linux命令或者shell腳本
java程序是提供了這個一方法,Processpro=Runtime.getRuntime().exec(cmds);
但是一般來說,盡量去用一些其他腳本(lua,shell,python)去執行一系列linux命令比較靈活, 而且耗費資源少。但是Runtime.getRuntime().exec()這種調用方式在java虛擬機中是十分消耗資源的,即使命令可以很快的執行完畢,頻繁的調用時創建進程消耗十分可觀。
java虛擬機執行這個命令的過程是,首先克隆一條和當前虛擬機擁有一樣環境變數的進程,再用這個新的進程執行外部命令,最後退出這個進程。頻繁的創建對CPU和內存的消耗很大。
下面是一個調用linux命令的例子:
publicclassTest{
publicstaticvoidmain(String[]args)throwsException{
String[]cmds={"/bin/sh","-c","ps-ef|grepjava"};
Processpro=Runtime.getRuntime().exec(cmds);
pro.waitFor();//阻塞,直到上述命令執行完
InputStreamin=pro.getInputStream();
BufferedReaderread=newBufferedReader(newInputStreamReader(in));
Stringline=null;
while((line=read.readLine())!=null){
System.out.println(line);
}
}
}