亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

如何使用JAVA調(diào)用SHELL

瀏覽:5日期:2022-08-30 10:49:56

通過ProcessBuilder進(jìn)行調(diào)度

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

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) { } } catch (IOException e) { } if (runningStatus != 0) { } return;

這里有必要解釋一下幾個(gè)參數(shù):

RUNNING_SHELL_FILE:要運(yùn)行的腳本SHELL_FILE_DIR:要運(yùn)行的腳本所在的目錄; 當(dāng)然你也可以把要運(yùn)行的腳本寫成全路徑。runningStatus:運(yùn)行狀態(tài),0標(biāo)識(shí)正常。 詳細(xì)可以看java文檔。param1, param2, param3:可以在RUNNING_SHELL_FILE腳本中直接通過1,2,$3分別拿到的參數(shù)。

直接通過系統(tǒng)Runtime執(zhí)行shell

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

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

我們發(fā)現(xiàn),通過Runtime的方式并沒有builder那么方便,特別是參數(shù)方面,必須自己加空格分開,因?yàn)閑xec會(huì)把整個(gè)字符串作為shell運(yùn)行。

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

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

沒權(quán)限運(yùn)行

這個(gè)情況我們團(tuán)隊(duì)的朱東方就遇到了, 在做DTS遷移的過程中,要執(zhí)行包里面的shell腳本, 解壓出來(lái)了之后,發(fā)現(xiàn)執(zhí)行不了。 那么就按照上面的方法授權(quán)吧

ProcessBuilder builder = new ProcessBuilder('/bin/chmod', '755', tempFile.getPath()); Process process = builder.start(); int rc = process.waitFor();

java進(jìn)行一直等待shell返回

這個(gè)問題估計(jì)更加經(jīng)常遇到。 原因是, shell腳本中有echo或者print輸出, 導(dǎo)致緩沖區(qū)被用完了! 為了避免這種情況, 一定要把緩沖區(qū)讀一下, 好處就是,可以對(duì)shell的具體運(yùn)行狀態(tài)進(jìn)行l(wèi)og出來(lái)。 比如上面我的例子中我會(huì)變成:

ProcessBuilder pb = 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(); BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); BufferedReader stdError = 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()之前把緩沖區(qū)讀出來(lái)打log, 就可以看到你的shell為什么會(huì)沒有按照預(yù)期運(yùn)行。 這個(gè)還有一個(gè)好處是,可以讀shell里面輸出的結(jié)果, 方便java代碼進(jìn)一步操作。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 日韩城人视频 | 欧美三级影院 | 中国xxxxx高清免费看视频 | 国产白嫩美女在线观看 | 久久久久琪琪免费影院 | 毛片a级三毛片免费播放 | 看一级特黄a大片日本片黑人 | 欧美草比视频 | 黑人干日本人 | 国产二区在线播放 | 国产高清狼人香蕉在线观看 | 国产一级特黄aa大片免费 | 九九99久久精品影视 | 国产一区二区精品久久91 | 成人午夜精品网站在线观看 | 免费观看激色视频网站(性色) | 国产第一草草影院 | 亚洲综合伊人制服丝袜美腿 | 免费大学生国产在线观看p 免费大黄网站在线观看 | 成人国产精品一级毛片天堂 | 色婷婷中文字幕 | 精品一区精品二区 | 久久久噜噜噜久久中文字幕色伊伊 | 欧美在线视频精品 | 在线亚洲精品自拍 | 国产偷2018在线观看午夜 | 性潮高免费视频免费看 | 高清国产一级精品毛片基地 | 久久国产精品自线拍免费 | 国产一区二区三区成人久久片 | 色婷婷资源网 | 青青热久免费精品视频在首页 | 91亚洲国产成人久久精品网站 | 欧美成人禁片在线www | 久久精品99成人中文字幕880 | 成人免费淫片在线费观看 | 2021久久精品国产99国产精品 | 亚洲国产精品免费在线观看 | 中文字幕日韩亚洲 | 一本久道久久综合狠狠爱 | 一级毛片免费毛片毛片 |