下面是一个用 Java 编写的简单的监控 Linux 服务器内存和磁盘的程序。这个程序会检查内存和磁盘的使用情况,如果发现内存或磁盘不足,就会触发报警,并尝试清理一些空间。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Date;
public class LinuxMonitor {
public static void main(String[] args) {
monitorSystemResources();
}
private static void monitorSystemResources() {
try {
// 获取当前时间
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String currentTime = dateFormat.format(new Date());
// 获取系统内存使用情况
double freeMemory = getFreeMemory();
double totalMemory = getTotalMemory();
double memoryUsage = (totalMemory - freeMemory) / totalMemory * 100;
System.out.println(currentTime + " - 内存使用情况: " + memoryUsage + "%");
// 获取磁盘使用情况
double freeDiskSpace = getFreeDiskSpace();
double totalDiskSpace = getTotalDiskSpace();
double diskUsage = (totalDiskSpace - freeDiskSpace) / totalDiskSpace * 100;
System.out.println(currentTime + " - 磁盘使用情况: " + diskUsage + "%");
// 如果内存或磁盘不足,触发报警并尝试清理空间
if (memoryUsage > 90) {
triggerAlarm("内存不足");
cleanupMemory();
}
if (diskUsage > 90) {
triggerAlarm("磁盘空间不足");
cleanupDiskSpace();
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
private static double getFreeMemory() throws IOException {
Process process = Runtime.getRuntime().exec("free -m");
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
reader.readLine(); // skip the header
String[] memoryInfo = reader.readLine().split("\\s+");
return Double.parseDouble(memoryInfo[3]); // free memory in MB
}
private static double getTotalMemory() throws IOException {
Process process = Runtime.getRuntime().exec("free -m");
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
reader.readLine(); // skip the header
String[] memoryInfo = reader.readLine().split("\\s+");
return Double.parseDouble(memoryInfo[1]); // total memory in MB
}
private static double getFreeDiskSpace() throws IOException {
Process process = Runtime.getRuntime().exec("df -h /");
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
reader.readLine(); // skip the header
String[] diskInfo = reader.readLine().split("\\s+");
return Double.parseDouble(diskInfo[3].replace("%", "")); // free disk space percentage
}
private static double getTotalDiskSpace() throws IOException {
Process process = Runtime.getRuntime().exec("df -h /");
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
reader.readLine(); // skip the header
String[] diskInfo = reader.readLine().split("\\s+");
return Double.parseDouble(diskInfo[1].replace("%", "")); // total disk space percentage
}
private static void triggerAlarm(String message) {
System.out.println("触发报警: " + message);
// 在这里可以添加发送报警邮件或其他通知的逻辑
}
private static void cleanupMemory() throws IOException, InterruptedException {
System.out.println("尝试清理内存...");
// 在这里可以添加清理内存的逻辑
// 例如: System.gc();
}
private static void cleanupDiskSpace() throws IOException, InterruptedException {
System.out.println("尝试清理磁盘空间...");
// 在这里可以添加清理磁盘空间的逻辑
// 例如: 删除一些不必要的文件
}
}
这个程序使用 free
命令获取内存信息,使用 df
命令获取磁盘信息。如果内存或磁盘使用率超过 90%,就会触发报警并尝试清理一些资源。请注意,清理内存和磁盘空间的方式可以根据实际情况进行修改。