日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java程序去調用并執行shell腳本及問題總結(推薦)

瀏覽:70日期:2022-08-31 09:25:42

摘要: 該文章來自阿里巴巴技術協會(ATA)精選集 背景 我們在開發過程中,大部分是java開發, 而在文本處理過程中,主要就是腳本進行開發。 java開發的特點就是我們可以很早地進行TDDL, METAQ 等等地對接; 而腳本開發的特點就是在進行批處理的時候非常方便。

背景

我們在開發過程中,大部分是java開發, 而在文本處理過程中,主要就是腳本進行開發。 java開發的特點就是我們可以很早地進行TDDL, METAQ 等等地對接; 而腳本開發的特點就是在進行批處理的時候非常方便。 前陣子我遇到這么一個需求場景: 對抓取的數據進行打包, 后來又遇到我要通過腳本進行抓取,比如nodejs下基于phantomjs的casperjs爬蟲。

解決方法

對于第一個問題:java抓取,并且把結果打包。 那么比較直接的做法就是,java接收各種消息(db,metaq等等),然后借助于jstorm集群進行調度和抓取。 最后把抓取的結果保存到一個文件中,并且通過調用shell打包, 回傳。 也許有同學會問, 為什么不直接把java調用odps直接保存文件,答案是,我們的集群不是hz集群,直接上傳odps速度很有問題,因此先打包比較合適。(這里不糾結設計了,我們回到正題)

java調用shell的方法

通過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) { } } 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腳本, 解壓出來了之后,發現執行不了。 那么就按照上面的方法授權吧

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

java進行一直等待shell返回

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

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

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

比如我在使用casperjs的時候,手工去執行shell明明是可以執行的,但是java調用的時候,發現總是出錯。 通過讀取緩沖區就能發現錯誤日志了。 我發現即便自己把安裝的casperjs的bin已經加入了path中(/etc/profile, 各種bashrc中)還不夠。 比如:

export NODE_HOME='/home/admin/node'export CASPERJS_HOME='/home/admin/casperjs'export PHANTOMJS_HOME='/home/admin/phantomjs'export PATH=$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/casperjs casperjs;ln -s /home/admin/node/bin/node node;ln -s /home/admin/phantomjs/bin/phantomjs phantomjs;

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

如果是通過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); JarFile topLevelJarFile = null; try { topLevelJarFile = new JarFile(jarPath); Enumeration<JarEntry> entries = topLevelJarFile.entries(); while (entries.hasMoreElements()) { JarEntry entry = entries.nextElement(); if (!entry.isDirectory() && entry.getName().endsWith('.sh')) { 對你的shell文件進行處理 } }

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

FileUtils.touch(tempjline);tempjline.deleteOnExit();FileOutputStream fos = new FileOutputStream(tempjline);IOUtils.copy(ClassLoaderUtil.class.getResourceAsStream(r), fos);fos.close();

有這個這個東東,相信大家會減少踩坑,而且大膽地使用java和腳本之間的交互吧。 java可以調用shell,那么shell再調用其他就方便了。 記得一點, 不要過度地依賴緩沖區進行線程之間的通信。原因自己去學習吧。

總結

到此這篇關于Java程序去調用并執行shell腳本及問題總結的文章就介紹到這了,更多相關java調用并執行shell腳本內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
丝袜亚洲精品中文字幕一区| 国产精品91一区二区三区| 好吊一区二区三区| 成人看片网站| 精品免费av在线| 久久久久亚洲| 久久久久午夜电影| 欧美午夜不卡影院在线观看完整版免费| 99精品在线| 亚洲无线一线二线三线区别av| 成人免费电影网址| 91精品一区国产高清在线gif| 午夜av成人| 狠狠操综合网| 丝袜诱惑制服诱惑色一区在线观看| 在线精品观看| 天海翼亚洲一区二区三区| 日韩精品成人| 精品一区二区三区视频在线播放| 成人亚洲精品| 激情丁香综合| 亚洲精品成人一区| 国产午夜久久av| 国产精品国产三级国产在线观看| 午夜影院一区| 久久国产精品久久久久久电车| 美国三级日本三级久久99 | 热三久草你在线| 久久久久久久久久久9不雅视频| 在线亚洲成人| 欧美日韩99| а√天堂8资源在线| 好吊视频一区二区三区四区| 日韩精品免费一区二区夜夜嗨| 国产精品亚洲四区在线观看| 伊人久久视频| 美国三级日本三级久久99 | 久久伊人久久| 欧美不卡在线| 久久国产麻豆精品| 国产一区二区三区黄网站| 日韩精品午夜| 午夜精品影视国产一区在线麻豆| 美女久久精品| 黄色亚洲在线| 欧美黑人做爰爽爽爽| 999久久久免费精品国产| 蜜桃久久久久久| 国产在线日韩精品| 免播放器亚洲| 成人在线视频中文字幕| 国产日韩专区| 成人国产精品| 视频精品一区| 亚洲特级毛片| 国产精品成人**免费视频 | 午夜在线一区二区| 国产美女撒尿一区二区| 亚洲午夜视频| 久久精品国产成人一区二区三区 | 久久久久中文| 奇米狠狠一区二区三区| 香蕉成人av| 婷婷五月色综合香五月| 日韩成人高清| 欧美日韩91| 欧美日韩一二| 国产精品qvod| 在线综合欧美| 国精品产品一区| 少妇精品久久久一区二区| 蜜臀久久精品| 久久丁香四色| 亚洲理论在线| 不卡中文字幕| 精品伊人久久久| 日本亚洲视频在线| 婷婷精品进入| 在线天堂中文资源最新版| 欧美视频精品全部免费观看| 欧美日韩水蜜桃| 国产伊人久久| 日韩激情一区二区| 亚洲一区二区三区免费在线观看| av资源中文在线| 国产精品中文字幕亚洲欧美| 日韩在线a电影| 激情欧美国产欧美| 成人午夜亚洲| 国产日产高清欧美一区二区三区 | 亚洲美女久久精品| 欧美亚洲一级| 亚洲乱码久久| 一本一本久久| 久久久国产亚洲精品| 麻豆精品国产91久久久久久| 亚欧洲精品视频在线观看| 一本色道精品久久一区二区三区| 日韩久久一区二区三区| 91精品啪在线观看国产18| 日韩精品一区二区三区免费视频| 国产精品嫩模av在线| 亚洲欧洲午夜| 欧美日韩视频免费观看| 奇米狠狠一区二区三区| 精品欧美一区二区三区在线观看| 国产欧美一区二区三区国产幕精品 | 欧美亚洲国产激情| 国产91在线精品| 国产精品xxxav免费视频| 日韩高清国产一区在线| 亚洲一区二区小说| 亚洲在线国产日韩欧美| 国产一区视频在线观看免费| 久久精品国内一区二区三区水蜜桃| 色婷婷亚洲mv天堂mv在影片| 精品欧美视频| 久久尤物视频| 精品国产乱码久久久久久樱花| 国产精品tv| 精品网站999| 精品久久99| 福利在线一区| 波多野结衣久久精品| 日韩精品电影| 性欧美videohd高精| 日韩精品免费一区二区三区| 极品av在线| 欧美日韩免费看片| 免费av一区| 免费精品视频| 日韩精品免费一区二区夜夜嗨| 欧美在线首页| 久久99国产精品视频| 精品99在线| 久久精品导航| 国产亚洲亚洲| 亚洲精品女人| 麻豆精品久久| 亚洲伦乱视频| 日韩午夜av| 深夜福利亚洲| 欧美一级网址| 精品网站999| 久久黄色影院| 三级亚洲高清视频| 日韩国产欧美视频| 麻豆精品视频在线观看免费| 国产不卡av一区二区| 99成人在线视频| 蜜桃av一区| 欧美私人啪啪vps| 欧美91在线|欧美| 少妇精品导航| 视频在线观看国产精品| 日韩1区2区日韩1区2区| 国产精品久久国产愉拍| 色爱综合网欧美| 妖精视频成人观看www| 91亚洲无吗| 97精品一区| 欧美中文日韩| 国产精品15p| 亚洲性视频h| 日本99精品| 国产精品不卡| 国产亚洲一区在线| 国产精品s色| re久久精品视频| 国产日韩在线观看视频| 一本大道色婷婷在线| 日韩精品一卡二卡三卡四卡无卡| 日本不卡中文字幕| 欧美少妇精品| 亚洲精品无吗| 日本欧美国产| 蜜桃免费网站一区二区三区| 美女精品一区二区| 国产视频一区三区| 免费在线亚洲欧美| 中文在线不卡| 精品一区二区三区中文字幕在线| 亚洲精品一区二区在线看| 欧美一区91| 久久久亚洲一区| 久久精品72免费观看| 蜜桃成人av| 国产探花在线精品一区二区| 亚洲h色精品| 日韩国产在线不卡视频| 久久精品欧美一区| 国产精品久久乐| 99国产精品久久久久久久| 国产精品三级| 午夜久久tv| 成人在线观看免费视频| 日韩一二三区在线观看| 国产一区日韩一区| 久久亚洲黄色| 午夜亚洲福利|