色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

Java在linux上調(diào)用shell腳本

Java在linux上調(diào)用shell腳本?

近期正好結(jié)合工作實(shí)踐,分享了一篇關(guān)于Java如何調(diào)用Shell的文章,希望能夠幫到您。內(nèi)容如下。

《Java 配 Shell 等于美酒加咖啡》

化學(xué)中我們得知「氫氣加氧氣在點(diǎn)燃的情況下會(huì)生成水」。

生活中我們得知「良辰加美景的情況下會(huì)得到千金春宵一刻」。

技術(shù)上又何嘗不是如此呢?先假設(shè)一個(gè)場(chǎng)景:BOSS 讓你實(shí)現(xiàn)一個(gè)服務(wù)監(jiān)控的指揮室,能看到每個(gè)服務(wù)器的磁盤剩余空間,能看到。。。能看到。。。

其實(shí)講真,實(shí)現(xiàn)思路有很多,但是不管黑貓白貓能抓住老鼠都是好貓,今天我們嘗試用 Java 與 Shell 搭配一下,看看是否會(huì)產(chǎn)生驚奇的反應(yīng)。

1. 首先通過(guò) JDK 源碼,品一品 Runtime 這杯美酒。

上圖是摘取 JDK 中 Runtime 的部分源碼,主要分成 4 大代碼段來(lái)粗略認(rèn)識(shí)她。

第一塊代碼段,可以看出 Runtime 構(gòu)造私有化,提供了靜態(tài)屬性,并提前創(chuàng)建對(duì)象實(shí)例,并提供獲取實(shí)例的靜態(tài)方法,這不就是單例設(shè)計(jì)模式的使用么,當(dāng)有面試官再問(wèn)設(shè)計(jì)模式,拿去狂噴。

第二塊代碼段,主要是 addShutdownHook() 方法,添加關(guān)閉的鉤子,說(shuō)的直白點(diǎn),其實(shí)允許研發(fā)人員插入一段在 JVM 關(guān)閉時(shí)執(zhí)行的代碼。例如在搭建服務(wù)框架時(shí),面對(duì)需要完成優(yōu)雅停服,打掃戰(zhàn)場(chǎng),釋放資源等等,諸如此類的場(chǎng)景下都很有用。其中在 Tomcat、Jetty 等容器中都可以看到 shutdownHook 的身影。

Runtime runtime = Runtime.getRuntime();

runtime.addShutdownHook(new Thread() {

@Override

public void run() {

System.out.println("打掃戰(zhàn)場(chǎng),釋放資源,完成優(yōu)雅停服");

}

});

System.out.println("服務(wù)啟動(dòng)完成");

代碼運(yùn)行效果如下。

服務(wù)啟動(dòng)完成

打掃戰(zhàn)場(chǎng),釋放資源,完成優(yōu)雅停服

第三塊代碼段,主要展現(xiàn) JDK 針對(duì) Runtime 提供的系列 exec 重載方法,這個(gè)是本次分享的重點(diǎn),重頭戲最后再說(shuō)。

第四塊代碼段,主要是 Runtime 提供的一些獲取系統(tǒng)信息的 API,直接拋代碼,拿去用就行了。

Runtime runtime = Runtime.getRuntime();

System.out.println(String.format("JVM可用本機(jī)CPU內(nèi)核數(shù) %d", runtime.availableProcessors()));

//默認(rèn)為系統(tǒng)的1/4

System.out.println(String.format("最大可用內(nèi)存空間 %d M", runtime.maxMemory() / 1024 / 1024));

//默認(rèn)為系統(tǒng)的1/64

System.out.println(String.format("可用內(nèi)存空間 %d M", runtime.totalMemory() / 1024 / 1024));

System.out.println(String.format("空閑內(nèi)存空間 %d M", runtime.freeMemory() / 1024 / 1024));

代碼運(yùn)行輸出如下,其實(shí)真實(shí)環(huán)境中不妨用模板引擎 FreeMarker 渲染,然后通過(guò)郵件告警,實(shí)現(xiàn)的逼格高一些。

2. 在詳細(xì)說(shuō) Runtime.exec() 這個(gè)重頭戲之前,再品一品 df 這款咖啡。

Linux df 命令,用于顯示目前在系統(tǒng)上的磁盤使用情況統(tǒng)計(jì),主要用于查看磁盤的分區(qū),磁盤已使用的空間,剩余的空間。

命令如下:

df [選項(xiàng)]... [FILE]...

常用選項(xiàng)如下:

3. Runtime 美酒加 Shell 咖啡會(huì)發(fā)生什么呢?

重頭戲開(kāi)始,回到 Runtime 的源碼,我們看到 exec() 系列方法會(huì)幫我們啟動(dòng)一個(gè) Process 進(jìn)程,那不妨把 df -h 命令傳入進(jìn)去一探究竟。

public class Foo {

public static void main(String[] args) throws Exception {

//df命令用于查看磁盤的分區(qū),磁盤已使用的空間,剩余的空間

//df -h以合適的單位來(lái)顯示信息

System.out.println(exec("df -h"));

}

private static String exec(String command) throws Exception {

String[] cmd = {"/bin/sh", "-c", command};

StringBuilder out = new StringBuilder();

BufferedReader reader = null;

InputStream in = null;

try {

Process process = Runtime.getRuntime().exec(cmd);

in = process.getInputStream();

reader = new BufferedReader(new InputStreamReader(in));

String line;

while ((line = reader.readLine()) != null) {

out.append(line + "\n");

}

process.waitFor();

} finally {

if (reader != null) {

reader.close();

}

}

return out.toString();

}

}

代碼中會(huì)發(fā)現(xiàn)調(diào)用了 process 的 waitFor() 方法,此方法作用會(huì)導(dǎo)致當(dāng)前線程等待,一直要等到由該 Process 對(duì)象表示的進(jìn)程終止,其實(shí)也就是等待把 exec 里面啟動(dòng)的 Process 中的所有事都干完(生產(chǎn)上出問(wèn)題的大多出在這兒),代碼運(yùn)行效果如下。

效果確實(shí)可以,那么這么一來(lái),想監(jiān)控統(tǒng)計(jì)什么功能,不妨直接把命令交給 Java 程序去執(zhí)行即可。

4.

如果關(guān)注一猿小講的伙伴應(yīng)該清楚,在《如何讓Java應(yīng)用成為殺不死的小強(qiáng)?(中篇)》《如何讓Java應(yīng)用成為殺不死的小強(qiáng)?(下篇)》兩篇中都用到了 ProcessBuilder 來(lái)執(zhí)行命令啟動(dòng)進(jìn)程,那 Runtime 與 ProcessBuilder 的主要區(qū)別是啥呢?

其實(shí) Runtime.exec() 方法設(shè)計(jì),可接受一個(gè)單獨(dú)的字符串,這個(gè)字符串是通過(guò)空格來(lái)分隔可執(zhí)行命令程序和參數(shù)的;當(dāng)然也可以接受字符串?dāng)?shù)組參數(shù)。

如上圖所示,ProcessBuilder 的方法入?yún)⑹且粋€(gè)List<String>或者多個(gè)字符串。

相同點(diǎn)是 ProcessBuilder.start() 和 Runtime.exec() 方法都被用來(lái)創(chuàng)建一個(gè)操作系統(tǒng)進(jìn)程(執(zhí)行命令行操作)。

5. 好了,幾分鐘的簡(jiǎn)單分享,主要讓你接觸并真正認(rèn)識(shí)一下 Runtime,希望能幫助你在工作中錦上添花。

最后依然用阿里新六脈神劍中的三脈送給大家:今天最好的表現(xiàn)是明天最低的要求;此時(shí)此刻非我莫屬;認(rèn)真生活快樂(lè)工作!

java單例模式,Java在linux上調(diào)用shell腳本