|
|
@@ -1,30 +1,30 @@
|
|
|
/// 磁盘空间监控
|
|
|
-const { exec } = require('child_process');
|
|
|
-const { promisify } = require('util');
|
|
|
+const { exec } = require("child_process");
|
|
|
+const { promisify } = require("util");
|
|
|
const execAsync = promisify(exec);
|
|
|
|
|
|
-const { sendEmail } = require('./email');
|
|
|
-const { sendSms } = require('./sms');
|
|
|
-const SmsTemplate = require('./sms-templates');
|
|
|
+const { sendEmail } = require("./email");
|
|
|
+const { sendSms } = require("./sms");
|
|
|
+const SmsTemplate = require("./sms-templates");
|
|
|
|
|
|
// 阈值配置
|
|
|
const USAGE_THRESHOLD = 90; // 使用率阈值 90%
|
|
|
const FREE_SPACE_THRESHOLD = 10; // 剩余空间阈值 10G
|
|
|
-const SERVER_NAME = process.env.NODE_ENV || 'unknown'; // 从环境变量读取服务器名称
|
|
|
+const SERVER_NAME = process.env.DOMAIN || "unknown"; // 从环境变量读取服务器名称
|
|
|
|
|
|
async function getDiskInfo() {
|
|
|
try {
|
|
|
- const { stdout } = await execAsync('df -h /');
|
|
|
- const lines = stdout.trim().split('\n');
|
|
|
-
|
|
|
+ const { stdout } = await execAsync("df -h /");
|
|
|
+ const lines = stdout.trim().split("\n");
|
|
|
+
|
|
|
if (lines.length < 2) {
|
|
|
- throw new Error('无法解析df命令输出');
|
|
|
+ throw new Error("无法解析df命令输出");
|
|
|
}
|
|
|
|
|
|
// 解析df输出
|
|
|
const dataLine = lines[1].trim().split(/\s+/);
|
|
|
const [filesystem, size, used, avail, usePercent, mountpoint] = dataLine;
|
|
|
-
|
|
|
+
|
|
|
return {
|
|
|
filesystem,
|
|
|
size,
|
|
|
@@ -32,7 +32,7 @@ async function getDiskInfo() {
|
|
|
avail,
|
|
|
usePercent: parseInt(usePercent),
|
|
|
mountpoint,
|
|
|
- raw: stdout
|
|
|
+ raw: stdout,
|
|
|
};
|
|
|
} catch (error) {
|
|
|
throw new Error(`获取磁盘信息失败: ${error.message}`);
|
|
|
@@ -43,35 +43,43 @@ function parseSize(sizeStr) {
|
|
|
// 将 "106G", "1.5T" 等格式转换为GB数值
|
|
|
const match = sizeStr.match(/^([\d.]+)([KMGT]?)$/i);
|
|
|
if (!match) return 0;
|
|
|
-
|
|
|
+
|
|
|
const value = parseFloat(match[1]);
|
|
|
const unit = match[2].toUpperCase();
|
|
|
-
|
|
|
- const multipliers = { '': 1/1024, 'K': 1/1024/1024, 'M': 1/1024, 'G': 1, 'T': 1024 };
|
|
|
+
|
|
|
+ const multipliers = {
|
|
|
+ "": 1 / 1024,
|
|
|
+ K: 1 / 1024 / 1024,
|
|
|
+ M: 1 / 1024,
|
|
|
+ G: 1,
|
|
|
+ T: 1024,
|
|
|
+ };
|
|
|
return value * (multipliers[unit] || 1);
|
|
|
}
|
|
|
|
|
|
async function checkDiskSpace() {
|
|
|
let diskInfo;
|
|
|
-
|
|
|
+
|
|
|
try {
|
|
|
diskInfo = await getDiskInfo();
|
|
|
} catch (e) {
|
|
|
- console.error('磁盘信息获取失败:', e.message);
|
|
|
+ console.error("磁盘信息获取失败:", e.message);
|
|
|
return {
|
|
|
result: false,
|
|
|
errcode: 200,
|
|
|
title: `磁盘监控:无法获取磁盘信息 [${SERVER_NAME}]`,
|
|
|
sms: SmsTemplate.SMS_DISK_ERROR,
|
|
|
data: [`服务器: ${SERVER_NAME}`, e.message],
|
|
|
- diskInfo: null
|
|
|
+ diskInfo: null,
|
|
|
};
|
|
|
}
|
|
|
|
|
|
const usagePercent = diskInfo.usePercent;
|
|
|
const availGB = parseSize(diskInfo.avail);
|
|
|
-
|
|
|
- console.log(`磁盘使用率: ${usagePercent}%, 剩余空间: ${availGB.toFixed(2)}GB`);
|
|
|
+
|
|
|
+ console.log(
|
|
|
+ `磁盘使用率: ${usagePercent}%, 剩余空间: ${availGB.toFixed(2)}GB`,
|
|
|
+ );
|
|
|
|
|
|
// 检查是否超过阈值
|
|
|
if (usagePercent >= USAGE_THRESHOLD || availGB < FREE_SPACE_THRESHOLD) {
|
|
|
@@ -80,7 +88,9 @@ async function checkDiskSpace() {
|
|
|
reasons.push(`使用率达到 ${usagePercent}% (阈值: ${USAGE_THRESHOLD}%)`);
|
|
|
}
|
|
|
if (availGB < FREE_SPACE_THRESHOLD) {
|
|
|
- reasons.push(`剩余空间仅 ${availGB.toFixed(2)}GB (阈值: ${FREE_SPACE_THRESHOLD}GB)`);
|
|
|
+ reasons.push(
|
|
|
+ `剩余空间仅 ${availGB.toFixed(2)}GB (阈值: ${FREE_SPACE_THRESHOLD}GB)`,
|
|
|
+ );
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
@@ -96,14 +106,14 @@ async function checkDiskSpace() {
|
|
|
`已使用: ${diskInfo.used}`,
|
|
|
`可用空间: ${diskInfo.avail}`,
|
|
|
`使用率: ${usagePercent}%`,
|
|
|
- '',
|
|
|
- '告警原因:',
|
|
|
+ "",
|
|
|
+ "告警原因:",
|
|
|
...reasons,
|
|
|
- '',
|
|
|
- '详细信息:',
|
|
|
- diskInfo.raw
|
|
|
+ "",
|
|
|
+ "详细信息:",
|
|
|
+ diskInfo.raw,
|
|
|
],
|
|
|
- diskInfo
|
|
|
+ diskInfo,
|
|
|
};
|
|
|
}
|
|
|
|
|
|
@@ -116,15 +126,15 @@ async function checkDiskSpace() {
|
|
|
`服务器: ${SERVER_NAME}`,
|
|
|
`文件系统: ${diskInfo.filesystem}`,
|
|
|
`使用率: ${usagePercent}%`,
|
|
|
- `剩余空间: ${diskInfo.avail}`
|
|
|
+ `剩余空间: ${diskInfo.avail}`,
|
|
|
],
|
|
|
- diskInfo
|
|
|
+ diskInfo,
|
|
|
};
|
|
|
}
|
|
|
|
|
|
async function run() {
|
|
|
console.log("检查磁盘空间...", new Date());
|
|
|
-
|
|
|
+
|
|
|
try {
|
|
|
const result = await checkDiskSpace();
|
|
|
console.log(result);
|