Explorar o código

update Admin.NET/Admin.NET.Core/Utils/ComputerUtil.cs.
- GetCPURate
我环境中使用Docker部署,镜像中的Linux不支持Top命令,所以改为从/proc/stat读取CPU信息再利用两次的CPU信息间隔计算相对准确的CPU使用率(间隔1秒)

- GetRunTime
同样,我的Linux镜像也不支持uptime命令,所以调整了系统启动时间的获取方式,这个应该兼容性更好一些。

- GetUnixMetrics
此方法之前有逻辑BUG,漏判了lines.Length =1 的情况,而且也是,我的镜像不支持free命令,换了一种方式,兼容性应该更好些。

Signed-off-by: 缄默 <pengyouak@163.com>

缄默 hai 1 ano
pai
achega
4dcc8a41c2
Modificáronse 1 ficheiros con 9 adicións e 15 borrados
  1. 9 15
      Admin.NET/Admin.NET.Core/Utils/ComputerUtil.cs

+ 9 - 15
Admin.NET/Admin.NET.Core/Utils/ComputerUtil.cs

@@ -180,7 +180,7 @@ public static class ComputerUtil
         }
         else if (IsUnix())
         {
-            string output = ShellUtil.Bash("top -b -n1 | grep \"Cpu(s)\" | awk '{print $2 + $4}'");
+            string output = ShellUtil.Bash("awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1); }' <(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat)");
             cpuRate = output.Trim();
         }
         else
@@ -209,7 +209,7 @@ public static class ComputerUtil
         }
         else if (IsUnix())
         {
-            string output = ShellUtil.Bash("uptime -s").Trim();
+            string output = ShellUtil.Bash("date -d \"$(awk -F. '{print $1}' /proc/uptime) second ago\" +\"%Y-%m-%d %H:%M:%S\"").Trim();
             runTime = DateTimeUtil.FormatTime((DateTime.Now - output.ParseToDateTime()).TotalMilliseconds.ToString().Split('.')[0].ParseToLong());
         }
         else
@@ -346,21 +346,15 @@ public class MemoryMetricsClient
     /// <returns></returns>
     public static MemoryMetrics GetUnixMetrics()
     {
-        string output = ShellUtil.Bash("free -m | awk '{print $2,$3,$4,$5,$6}'");
+        string output = ShellUtil.Bash("awk '/MemTotal/ {total=$2} /MemAvailable/ {available=$2} END {print total,available}' /proc/meminfo");
         var metrics = new MemoryMetrics();
-        var lines = output.Split('\n', (char)StringSplitOptions.RemoveEmptyEntries);
-        if (lines.Length <= 0) return metrics;
+        var memory = output.Split(' ', (char)StringSplitOptions.RemoveEmptyEntries);
+        if (memory.Length != 2) return metrics;
+ 
+        metrics.Total = double.Parse(memory[0]) / 1024;
+        metrics.Free = double.Parse(memory[1]) / 1024;
+        metrics.Used = metrics.Total - metrics.Free;
 
-        if (lines != null && lines.Length > 0)
-        {
-            var memory = lines[1].Split(' ', (char)StringSplitOptions.RemoveEmptyEntries);
-            if (memory.Length >= 3)
-            {
-                metrics.Total = double.Parse(memory[0]);
-                metrics.Used = double.Parse(memory[1]);
-                metrics.Free = double.Parse(memory[2]);//m
-            }
-        }
         return metrics;
     }