node.js - 如何在 Windows 上的 node.js 中获取/计算当前磁盘活动
问题描述
我正在寻找一种像 Windows 一样计算磁盘活动百分比的方法,而不是使用的空间。当活动长时间太高时,我希望能够从我的应用程序发送警报,表明服务器过载。我找不到任何可以做到这一点的插件,只有告诉磁盘空间使用的插件。
--编辑感谢 mihai 的回答。这是我编写的函数,以防其他人需要它。
第一个版本每次都会启动和停止任务。
function getDiskTimePercent() {
return new Promise(function (resolve, reject) {
exec('typeperf "\\LogicalDisk(C:)\\% Disk Time" -SC 1', function (error, stdout, stderr) {
if (error) {
reject(error);
} else {
const lines = stdout.split('\r\n');
const values = lines[2].split(",");
const result = Math.round(values.pop().replace(/"/g, ''), 0);
resolve(result);
}
});
});
}
这个下一个版本更适合经常定时更新的网站。它让进程运行 50 个样本,然后重新启动进程。如果节点崩溃,这可以防止进程永远运行。
let diskTrackerProcess;
let diskTrackerCurrent = 0;
function getDiskTimePercent() {
if (!diskTrackerProcess) {
diskTrackerProcess = exec('typeperf.exe "\\LogicalDisk(C:)\\% Disk Time" -SC 50');
diskTrackerProcess.stdout.on('data', function (data) {
const stdout = data.toString();
const lines = stdout.split('\r\n');
const values = lines[0].split(",");
const result = Math.round(values.pop().replace(/"/g, ''), 0);
if (!isNaN(result)) {
diskTrackerCurrent = result;
}
});
diskTrackerProcess.on('exit', function (code) {
diskTrackerProcess = null;
});
return diskTrackerCurrent;
} else {
return diskTrackerCurrent;
}
}
解决方案
Node 本身不是一个好的选择,但你总是可以用它调用外部程序。
我会研究typeperf,一个本机 Windows 命令行实用程序。
我能够通过以下方式在磁盘上获取活动:
typeperf "\\MyComputerName\LogicalDisk(C:)\% Disk Time"
更改MyComputerName
为您的机器名称和C:
您要监视的磁盘。
输出:
"10/30/2018 22:25:42.132","0.000000"
"10/30/2018 22:25:43.139","0.000000"
"10/30/2018 22:25:44.211","0.000000"
"10/30/2018 22:25:45.220","0.000000"
"10/30/2018 22:25:46.225","0.000000"
"10/30/2018 22:25:47.232","0.081097"
"10/30/2018 22:25:48.237","0.000000"
"10/30/2018 22:25:49.251","0.197538"
"10/30/2018 22:25:50.321","60.390202"
"10/30/2018 22:25:51.333","97.860753"
"10/30/2018 22:25:52.337","11.451819"
"10/30/2018 22:25:53.351","34.524372"
最后一个数字应显示磁盘活动。如果它大于 0,则意味着您的磁盘上发生了一些事情。该命令似乎需要管理员权限或一些提升的特权,这在您的情况下可能是也可能不是问题。
您可以轻松地从节点调用此命令(使用child_process),并解析输出。
推荐阅读
- java - 当我添加芯片组时,程序不起作用
- shell - Ansible:如何使用 shell 输出运行命令
- ios - 使用 CocoaMQTT 连接到我的 mqtt 代理时出现问题
- react-native - React Native 应用程序在启动时卡在白屏上
- javascript - 如何提交带有数组的html?
- reactjs - 图表专家数据系列更改后如何让图表专家图例重绘
- ionic-framework - 离子服务命令登陆到 balnk 屏幕
- laravel - 如果 php artisan serve 不起作用,如何更新 vue 组件?
- javascript - 在 AJAX 成功重新加载 DATATABLE 而不刷新页面
- excel - 在 Windows 任务计划程序中计划时如何通过 VBA 发送电子邮件?