java執行腳本代碼,java 調用腳本

java怎么執行shell腳本

如果shell腳本和java程序運行在不同的服務器上,可以使用遠程執行Linux命令執行包,使用ssh2協議連接遠程服務器,并發送執行命令就行了,ganymed.ssh2相關mave配置如下,你可以自己百度搜索相關資料。

我們提供的服務有:成都網站設計、成都網站建設、微信公眾號開發、網站優化、網站認證、萬全ssl等。為上1000+企事業單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的萬全網站制作公司

如果shell腳本和java程序在同一臺服務器上,

這里不得不提到java的process類了。

process這個類是一個抽象類,封裝了一個進程(你在調用linux的命令或者shell腳本就是為了執行一個在linux下執行的程序,所以應該使用process類)。

process類提供了執行從進程輸入,執行輸出到進程,等待進程完成,檢查進程的推出狀態,以及shut down掉進程。

dependency??

groupIdcom.ganymed.ssh2/groupId??

artifactIdganymed-ssh2-build/artifactId??

version210/version??

/dependency

本地執行命令代碼如下:

String?shpath="/test/test.sh";???//程序路徑

Process?process?=null;

String?command1?=?“chmod?777?”?+?shpath;

process?=?Runtime.getRuntime().exec(command1);

process.waitFor();

怎么在java中執行UNIX腳本代碼

public static void parseLog(ArrayListString logAddress,

ArrayListString exceWords, HashMapString,String excelevel,String beginTime,int start,int end,String fmt) throws IOException,

InterruptedException {

Date date = null;

long dbDate = 0;

dbDate = DBLogExce.getMaxDate();

for (int i = 0; i logAddress.size(); i++) {//遍歷URLString url = logAddress.get(i);

//主要運用java中的Process類,調用exc();方法,執行命令,的到輸入流,解讀文件,

Process proc = null;try {proc = Runtime.getRuntime().exec(

"grep " + "'" + beginTime + "' " + url);

} catch (IOException e) {

e.printStackTrace();}InputStream stderr = proc.getErrorStream();

InputStreamReader isr = new InputStreamReader(stderr);

BufferedReader br = new BufferedReader(isr);

String line = null;

while ((line = br.readLine()) != null)

System.out.println("OUT");

for(int j=0;jexceWords.size();j++){

//判斷當天的日志是否包含異常關鍵字

int index = line.indexOf(exceWords.get(j));

if(index!=-1){

String exceLevel = excelevel.get(exceWords.get(j));

//解析異常得到時間

line = line.substring(start, end);

date = ToolUtils.parseToDate(line, fmt);

long l = date.getTime();

//判斷大于數據庫最大時間,插庫

怎么通過java去調用并執行shell腳本以及問題總結

對于第一個問題:java抓取,并且把結果打包。那么比較直接的做法就是,java接收各種消息(db,metaq等等),然后借助于jstorm集群進行調度和抓取。

最后把抓取的結果保存到一個文件中,并且通過調用shell打包, 回傳。 也許有同學會問,

為什么不直接把java調用odps直接保存文件,答案是,我們的集群不是hz集群,直接上傳odps速度很有問題,因此先打包比較合適。(這里不糾結設計了,我們回到正題)

java調用shell的方法

通過ProcessBuilder進行調度

這種方法比較直觀,而且參數的設置也比較方便, 比如我在實踐中的代碼(我隱藏了部分業務代碼):

ProcessBuilderpb = new ProcessBuilder("./" + RUNNING_SHELL_FILE, param1,

param2, param3);

pb.directory(new File(SHELL_FILE_DIR));

int runningStatus = 0;

String s = null;

try {

Process p = pb.start();

try {

runningStatus = p.waitFor();

} catch (InterruptedException e) {

}

} catch (IOException e) {

}

if (runningStatus != 0) {

}

return;

這里有必要解釋一下幾個參數:

RUNNING_SHELL_FILE:要運行的腳本

SHELL_FILE_DIR:要運行的腳本所在的目錄; 當然你也可以把要運行的腳本寫成全路徑。

runningStatus:運行狀態,0標識正常。 詳細可以看java文檔。

param1, param2, param3:可以在RUNNING_SHELL_FILE腳本中直接通過1,2,$3分別拿到的參數。

直接通過系統Runtime執行shell

這個方法比較暴力,也比較常用, 代碼如下:

p = Runtime.getRuntime().exec(SHELL_FILE_DIR + RUNNING_SHELL_FILE + " "+param1+" "+param2+" "+param3);

p.waitFor();

我們發現,通過Runtime的方式并沒有builder那么方便,特別是參數方面,必須自己加空格分開,因為exec會把整個字符串作為shell運行。

可能存在的問題以及解決方法

如果你覺得通過上面就能滿足你的需求,那么可能是要碰壁了。你會遇到以下情況。

沒權限運行

這個情況我們團隊的朱東方就遇到了, 在做DTS遷移的過程中,要執行包里面的shell腳本, 解壓出來了之后,發現執行不了。 那么就按照上面的方法授權吧

java進行一直等待shell返回

這個問題估計更加經常遇到。 原因是, shell腳本中有echo或者print輸出, 導致緩沖區被用完了! 為了避免這種情況, 一定要把緩沖區讀一下, 好處就是,可以對shell的具體運行狀態進行log出來。 比如上面我的例子中我會變成:

ProcessBuilderpb = new ProcessBuilder("./" + RUNNING_SHELL_FILE, keyword.trim(),

taskId.toString(), fileName);

pb.directory(new File(CASPERJS_FILE_DIR));

int runningStatus = 0;

String s = null;

try {

Process p = pb.start();

BufferedReaderstdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));

BufferedReaderstdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));

while ((s = stdInput.readLine()) != null) {

LOG.error(s);

}

while ((s = stdError.readLine()) != null) {

LOG.error(s);

}

try {

runningStatus = p.waitFor();

} catch (InterruptedException e) {

}

記得在start()之后, waitFor()之前把緩沖區讀出來打log, 就可以看到你的shell為什么會沒有按照預期運行。 這個還有一個好處是,可以讀shell里面輸出的結果, 方便java代碼進一步操作。

也許你還會遇到這個問題,明明手工可以運行的命令,java調用的shell中某一些命令居然不能執行,報錯:命令不存在!

比如我在使用casperjs的時候,手工去執行shell明明是可以執行的,但是java調用的時候,發現總是出錯。

通過讀取緩沖區就能發現錯誤日志了。 我發現即便自己把安裝的casperjs的bin已經加入了path中(/etc/profile,

各種bashrc中)還不夠。 比如:

exportNODE_HOME="/home/admin/node"

exportCASPERJS_HOME="/home/admin/casperjs"

exportPHANTOMJS_HOME="/home/admin/phantomjs"

exportPATH=$PATH:$JAVA_HOME/bin:/root/bin:$NODE_HOME/bin:$CASPERJS_HOME/bin:$PHANTOMJS_HOME/bin

原來是因為java在調用shell的時候,默認用的是系統的/bin/下的指令。特別是你用root權限運行的時候。 這時候,你要在/bin下加軟鏈了。針對我上面的例子,就要在/bin下加軟鏈:

ln -s /home/admin/casperjs/bin/casperjscasperjs;

ln -s /home/admin/node/bin/nodenode;

ln -s /home/admin/phantomjs/bin/phantomjsphantomjs;

這樣,問題就可以解決了。

如果是通過java調用shell進行打包,那么要注意路徑的問題了

因為shell里面tar的壓縮和解壓可不能直接寫:

tar -zcf /home/admin/data/result.tar.gz /home/admin/data/result

直接給你報錯,因為tar的壓縮源必須到路徑下面, 因此可以寫成

tar -zcf /home/admin/data/result.tar.gz -C /home/admin/data/ result

如果我的shell是在jar包中怎么辦?

答案是:解壓出來。再按照上面指示進行操作。(1)找到路徑

String jarPath = findClassJarPath(ClassLoaderUtil.class);

JarFiletopLevelJarFile = null;

try {

topLevelJarFile = new JarFile(jarPath);

EnumerationJarEntry entries = topLevelJarFile.entries();

while (entries.hasMoreElements()) {

JarEntryentry = entries.nextElement();

if (!entry.isDirectory() entry.getName().endsWith(".sh")) {

對你的shell文件進行處理

}

}

對文件處理的方法就簡單了,直接touch一個臨時文件,然后把數據流寫入,代碼:

FileUtils.touch(tempjline);

tempjline.deleteOnExit();

FileOutputStreamfos = new FileOutputStream(tempjline);

IOUtils.copy(ClassLoaderUtil.class.getResourceAsStream(r), fos);

fos.close();

如何在java中執行shell腳本

1、最常用的方法:

Process?p?=?Runtime.getRuntime().exec(SHELL_FILE_DIR?+?RUNNING_SHELL_FILE?+?

"?"+param1+"?"+param2+"?"+param3);?

int?runnngStatus?=?p.waitFor();

2、通過ProcessBuilder進行調度,這種方法比較直觀,而且參數的設置也比較方便:

ProcessBuilder?pb?=?new?ProcessBuilder("./"?+?RUNNING_SHELL_FILE,?param1,

param2,?param3);

pb.directory(new?File(SHELL_FILE_DIR));

int?runningStatus?=?0;

String?s?=?null;

try?{

Process?p?=?pb.start();

try?{

runningStatus?=?p.waitFor();

}?catch?(InterruptedException?e)?{

e.printStackTrace();

}

}?catch?(IOException?e)?{

e.printStackTrace();???

}

if?(runningStatus?!=?0)?{

}

return;

參數說明:

RUNNING_SHELL_FILE:要運行的腳本

SHELL_FILE_DIR:要運行的腳本所在的目錄; 當然你也可以把要運行的腳本寫成全路徑。

runningStatus:運行狀態,0標識正常。 詳細可以看java文檔。

param1, param2, param3:可以在RUNNING_SHELL_FILE腳本中直接通過1,1,2,$3分別拿到的參數。

怎么使用java運行python腳本?

如果是jython,也就是運行在Jvm上的python的話,可以使用JSR223,JDK1.6已經包含了該擴展包。JSR223是一個用于解析多種腳本語言的庫包,其中包括Jython。除了JSR223包之外,還需要jython-engine.jar包。

ScriptEngine engine = new ScriptEngineManager().getEngineByName("python");

try

{

engine.eval(new FileReader("./script/listing.py"));

}

catch(ScriptException se)

{

}

catch(IOException ie)

{

}

或者參考:

很久之前用過ScriptEngine,對在Jvm上的腳本語言比如jruby,jython,groovy等支持性都很好,有點忘記了。

分享文章:java執行腳本代碼,java 調用腳本
當前地址:http://m.kartarina.com/article22/hsdejc.html

成都網站建設公司_創新互聯,為您提供外貿建站響應式網站移動網站建設企業建站Google搜索引擎優化

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

搜索引擎優化
主站蜘蛛池模板: AV无码久久久久不卡蜜桃| heyzo高无码国产精品| 亚洲Av无码乱码在线观看性色| 中文字幕无码久久久| 亚洲精品无码成人| 久久久久无码精品国产| 亚洲伊人成无码综合网| 中文成人无码精品久久久不卡| 午夜无码伦费影视在线观看| 精品国产毛片一区二区无码| 色窝窝无码一区二区三区成人网站| 国产AV无码专区亚洲AV漫画| 国产99久久九九精品无码| 日韩精品无码中文字幕一区二区 | 国产成人无码免费看片软件| 亚洲VA成无码人在线观看天堂| 无码人妻少妇伦在线电影| 国产精品无码一区二区在线| 无码人妻精品一区二区三区久久久| 97人妻无码一区二区精品免费| 国内精品人妻无码久久久影院导航| 免费看国产成年无码AV片| 无码成人AAAAA毛片| 亚洲AV无码久久久久网站蜜桃| 中文无码字慕在线观看| 国产精品无码无卡在线播放| 无码孕妇孕交在线观看| 成人无码AV一区二区| 亚洲?V无码成人精品区日韩| 午夜爽喷水无码成人18禁三级| 少妇无码AV无码专区在线观看 | 自拍偷在线精品自拍偷无码专区| 久久人午夜亚洲精品无码区| 亚洲AV无码乱码在线观看富二代 | 久久人妻无码一区二区| 中文字幕久久久人妻无码| 久久久无码精品亚洲日韩蜜臀浪潮 | 国产乱人伦中文无无码视频试看| 色综合久久无码五十路人妻| 亚洲av永久无码精品漫画| 亚洲AV无码一区东京热久久|