Java實(shí)現(xiàn)獲取服務(wù)器資源(內(nèi)存,負(fù)載,磁盤(pán)容量)
1.說(shuō)明
我們經(jīng)常通過(guò)SSH終端發(fā)送shell命令進(jìn)行服務(wù)器運(yùn)維,從而獲取到服務(wù)器的各種資源,按照這個(gè)思路,我們可以利用Java做一個(gè)定時(shí)任務(wù),定時(shí)采集服務(wù)器資源使用情況,從而實(shí)現(xiàn)服務(wù)器資源的動(dòng)態(tài)呈現(xiàn)。
2.封裝SSH操作方法
首先我們定義SSH連接實(shí)體類(lèi)。
/**
* SSH連接
* @author Mr.Li
* @date 2023-01-01
*/
public class SshConnection {
private String username;
private String password;
private String hostname;
public SshConnection(String username, String password, String hostname) {
this.username = username;
this.password = password;
this.hostname = hostname;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getHostname() {
return hostname;
}
}然后封裝SSH命令操作方法
引入Jar包
<dependency>
<groupId>org.apache.sshd</groupId>
<artifactId>sshd-core</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>net.i2p.crypto</groupId>
<artifactId>eddsa</artifactId>
<version>0.3.0</version>
</dependency>/**
* SSH linux操作類(lèi)
* @author Mr.Li
* @date 2023-01-06
*/
@Slf4j
public class SSHLinuxUtils {
/**
* 執(zhí)行Shell命令并返回結(jié)果
* @param conn
* @param cmd
* @param timeout
* @return
* @throws IOException
*/
public static SshResponse runCommand(SshConnection conn, String cmd, long timeout) {
SshClient client = SshClient.setUpDefaultClient();
try {
//Open the client
client.start();
//Connect to the server
String hostIp="";
Integer port=22;
String [] hostArr=conn.getHostname().split(":");
if(hostArr.length>1){
hostIp=hostArr[0];
port=Integer.parseInt(hostArr[1]);
}else{
hostIp=hostArr[0];
}
ConnectFuture cf = client.connect(conn.getUsername(), hostIp, port);
ClientSession session = cf.verify().getSession();
session.addPasswordIdentity(conn.getPassword());
session.auth().verify(TimeUnit.SECONDS.toMillis(timeout));
//Create the exec and channel its output/error streams
ChannelExec ce = session.createExecChannel(cmd);
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayOutputStream err = new ByteArrayOutputStream();
ce.setOut(out);
ce.setErr(err);
//Execute and wait
ce.open();
Set<ClientChannelEvent> events =
ce.waitFor(EnumSet.of(ClientChannelEvent.CLOSED), TimeUnit.SECONDS.toMillis(timeout));
session.close(false);
//Check if timed out
if (events.contains(ClientChannelEvent.TIMEOUT)) {
log.error(conn.getHostname()+" 命令 "+cmd+ "執(zhí)行超時(shí) "+timeout);
}
return new SshResponse(out.toString(), err.toString(), ce.getExitStatus());
}catch (Exception e){
log.error("runCommand:cmd:{}",cmd,e);
return null;
} finally {
client.stop();
}
}
}3.執(zhí)行Shell命令
連接服務(wù)器
SshConnection sshConnection = new SshConnection("遠(yuǎn)程登錄服務(wù)器用戶(hù)名","遠(yuǎn)程登錄服務(wù)器密碼","遠(yuǎn)程登錄服務(wù)器的IP端口");以獲取內(nèi)存為例:
//獲取內(nèi)存的命令 String cmd="sudo cat /proc/meminfo"; //執(zhí)行獲取當(dāng)前內(nèi)存的命令 SshResponse sshResponse = SSHLinuxUtils.runCommand(sshConnection,cmd,3); //其中StdOutput為獲取到的內(nèi)存數(shù)據(jù) String outPut=sshResponse.getStdOutput();
獲取負(fù)載與磁盤(pán),則只需要經(jīng)命令更換成如下命令即可
//負(fù)載 String cmd="sudo cat /proc/loadavg"; //磁盤(pán) String cmd="sudo df -h";
4.效果呈現(xiàn)
結(jié)合自己的業(yè)務(wù),以及之前介紹的關(guān)于Supervisor監(jiān)控服務(wù)的對(duì)接,我們可以完成一個(gè)簡(jiǎn)單的服務(wù)運(yùn)維業(yè)務(wù)。

監(jiān)控指標(biāo)

進(jìn)程監(jiān)控

到此這篇關(guān)于Java實(shí)現(xiàn)獲取服務(wù)器資源(內(nèi)存,負(fù)載,磁盤(pán)容量)的文章就介紹到這了,更多相關(guān)Java獲取服務(wù)器資源內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入學(xué)習(xí)Java同步機(jī)制中的底層實(shí)現(xiàn)
在多線(xiàn)程編程中我們會(huì)遇到很多需要使用線(xiàn)程同步機(jī)制去解決的并發(fā)問(wèn)題,這些同步機(jī)制是如何實(shí)現(xiàn)的呢?下面和小編來(lái)一起學(xué)習(xí)吧2019-05-05
Java 數(shù)據(jù)結(jié)構(gòu)之刪除鏈表中重復(fù)的結(jié)點(diǎn)
在一個(gè)排序的鏈表中,會(huì)存在重復(fù)的結(jié)點(diǎn),如何實(shí)現(xiàn)刪除該鏈表中重復(fù)的結(jié)點(diǎn),重復(fù)的結(jié)點(diǎn)不保留,并返回鏈表頭指針呢?接下來(lái)小編將帶你詳細(xì)介紹2021-12-12
java設(shè)計(jì)模式之組合模式(Composite)
這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之組合模式Composite,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
Java中實(shí)現(xiàn)OCR識(shí)別讀取圖片中的文字
圖片內(nèi)容一般無(wú)法編輯,如果想要讀取圖片中的文本,我們需要用到OCR工具,本文將介紹如何在Java中實(shí)現(xiàn)OCR識(shí)別讀取圖片中的文字,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04
基于Java編寫(xiě)emoji表情處理工具類(lèi)
這篇文章主要為大家詳細(xì)介紹了如何基于Java編寫(xiě)一個(gè)emoji表情處理工具類(lèi),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
SpringBoot中使用Redis作為全局鎖示例過(guò)程
這篇文章主要為大家介紹了SpringBoot中使用Redis作為全局鎖示例過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
Java API如何實(shí)現(xiàn)向Hive批量導(dǎo)入數(shù)據(jù)
這篇文章主要介紹了Java API如何實(shí)現(xiàn)向Hive批量導(dǎo)入數(shù)據(jù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
SpringMVC實(shí)現(xiàn)文件的上傳和下載實(shí)例代碼
本篇文章主要介紹了SpringMVC實(shí)現(xiàn)文件的上傳和下載實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
Java中包裝類(lèi)和Arrays類(lèi)的詳細(xì)介紹
Arrays針對(duì)于數(shù)組做操作的類(lèi),該類(lèi)包含用于操作數(shù)組的各種方法(如排序和搜索),這篇文章主要給大家介紹了關(guān)于Java中包裝類(lèi)和Arrays類(lèi)的詳細(xì)介紹,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
JAVA?IDEA項(xiàng)目打包為jar包的步驟詳解
在Java開(kāi)發(fā)中我們通常會(huì)將我們的項(xiàng)目打包成可執(zhí)行的Jar包,以便于在其他環(huán)境中部署和運(yùn)行,下面這篇文章主要給大家介紹了關(guān)于JAVA?IDEA項(xiàng)目打包為jar包的相關(guān)資料,需要的朋友可以參考下2024-08-08

