java調用sh腳本
① sh腳本如何自動執行java程序,並且該腳本如何被定期調用
各位好我有一個問題,是這樣: 環境:有一套管理系統(包括聯機和批量),該管理系統白天運行聯機系統,晚上運行批量系統。 目的:聯機系統運行到晚上,會停掉,這時候通過在unix下的sh腳本調用並且啟動批量系統。 sh腳本可以調用java程序,通過java程序就可以啟動了批量系統。 andilyliao 寫道最簡單的方法 你可以用java寫一個job 然後每天晚上執行sh mginobili 寫道可以在腳本中 實現一個定時功能啊 比如每隔半小時 檢查一次當前的時間 如果到了晚上 就停止聯機系統,運行批量系統 當然前提是 這個sh腳本要一直保持運行狀態 並且其錯誤處理機制要完善問題補充:哦。你的意思是不是這樣啊, 這個sh腳本作為一個定時器,定時調用啟動聯機系統或者批量系統的程序。 通過while(1)這樣一個循環,一直運行不中斷,然後sleep一定時間,就調用聯機的啟動程序,再過一定時間,關閉聯機啟動批量系統。
② 通過java程序(JSch)運行遠程linux主機上的shell腳本
通過Java程序運行遠程Linux主機上的shell腳本是可能的,這需要藉助JSch庫來實現。
在使用之前,請確保遠程主機已經開啟SSH服務。接下來,通過Maven坐標引入JSch依賴庫,以執行遠程主機上的腳本。
創建名為「hello.sh」的文件,內容僅用於測試,即輸出「hello 」。將此文件保存在遠程主機的「/root」目錄下,並為腳本設置可執行許可權。
使用以下Java代碼在本地執行遠程主機上的shell腳本,代碼中包含了詳細的注釋以說明其功能。執行後,可以在本地控制台獲取遠程主機上shell腳本的執行結果。
實例代碼演示了如何實現遠程Linux主機上的shell腳本執行。此外,代碼可以通過進一步封裝來提供更簡便的使用方式。
總結,通過Java程序和JSch庫可以輕松運行遠程Linux主機上的shell腳本,並獲取執行結果。
③ 如何在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()這個加上。
④ 如何在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);
}
}
}
註:參數中逗/bin/sh逗 逗-c逗 是可以用shell執行指定的命令的意思
這里/bin/sh -cps -ef|grep java,會執行ps linux命令
⑤ java怎麼調用shell腳本
//用法:Runtime.getRuntime().exec("命令");Stringshpath="/test/test.sh";//程序路徑Processprocess=null;Stringcommand1=「chmod777」+shpath;try{Runtime.getRuntime().exec(command1).waitFor();}catch(IOExceptione1){e1.printStackTrace();}catch(InterruptedExceptione){e.printStackTrace();}Stringvar="201102";/參數Stringcommand2=「/bin/sh」+shpath+」」+var;Runtime.getRuntime().exec(command2).waitFor();