cpumon_light reimplementation to avoid fork
authorThomas Pérennou (Viveris Technologie) <thomas.perennou@external.thalesgroup.com>
Wed, 18 Feb 2015 16:23:47 +0000 (17:23 +0100)
committerThomas Pérennou (Viveris Technologie) <thomas.perennou@external.thalesgroup.com>
Wed, 18 Feb 2015 16:23:47 +0000 (17:23 +0100)
master/root/bin/cpumon_light

index e4509524d35fe195af0ecdf410e24349a274e48a..af635c108028727331031ea671020e4a686ed009 100755 (executable)
@@ -1,20 +1,36 @@
-#!/bin/sh
+#!/usr/bin/perl
 
-INSTALL_DIR=$(dirname $0)
+use strict;
 
-$INSTALL_DIR/monitor_proc -s /proc/stat
-while true; do
-       sleep 1
-       $INSTALL_DIR/monitor_proc /proc/stat | \
-               awk '
-BEGIN { printf "cpu:" }
-/cpu[0-9]/ {
-       idle=$5
-       sum=0; for (i=2;i<=NF;i++) sum+=$(i)
-       load=(sum-idle)*100/sum
-       tot+=load
-       if (!not_first) not_first=1; else printf " +"
-       printf " % 5.1f%%", load
+my @cpu_stat_t0 = proc_stat();
+sleep 1;
+my @cpu_stat_t1 = proc_stat();
+my $total = 0;
+for (my $cpu_i = 0; $cpu_i < (scalar @cpu_stat_t0); $cpu_i++) {
+    my @stat_t0 = split /\s+/, $cpu_stat_t0[$cpu_i];
+    my @stat_t1 = split /\s+/, $cpu_stat_t1[$cpu_i];
+    my ($t0_idle, $t1_idle) = ($stat_t0[3], $stat_t1[3]);
+    my ($t0_total, $t1_total) = (0, 0);
+    $t0_total += $_ foreach @stat_t0;
+    $t1_total += $_ foreach @stat_t1;
+
+    my $load = ($t1_total - $t0_total == 0) ? 100:
+        int((100 * (($t1_total - $t0_total) - ($t1_idle - $t0_idle))/($t1_total - $t0_total)) + 0.5);
+    print " +" unless ($cpu_i == 0);
+    printf "% 5.1f%% ", $load;
+    $total += $load;
+}
+printf " = % 6.1f%%\n", $total;
+
+sub proc_stat() {
+    return grep {s/^cpu\d+\s//} read_file('/proc/stat');
 }
-END { printf " = % 6.1f%%\n", tot }'
-done
+
+sub read_file($) {
+    my ($file) = @_;
+    open FILE, "<$file";
+    my @content = <FILE>;
+    close FILE;
+    return @content;
+}
+