LINUX.ORG.RU

История изменений

Исправление ugoday, (текущая версия) :

Меж тем аккурат под католическое рождество вышел libre-classic-ng 0.0.1, форк полулярного free-classic-ng, в котором были решены две главные проблемы оригиналы:

  • Нот инвентед хере (да её и на перле!)
  • Ужасные ошибки округления

Собственно, сама программа:

#!/usr/bin/guile \
-e main -s
!#

(use-modules (ice-9 rdelim))
(use-modules (ice-9 format))

(define db "/proc/meminfo")
(define factors '((kb . 0)
                  (Mb . 10)
                  (Gb . 20)
                  (Tb . 30)))

(define (parse-meminfo line)
  (filter
   (lambda (s)
     (not (string-null? s)))
   (string-split line #\Space)))

(define (add-line new-line acc)
  (let* ((key-value (parse-meminfo new-line))
         (key (car key-value))
         (value-in-kb (string->number (cadr key-value))))
    (acons key value-in-kb acc)))

(define (file->mem-info . arg)
  (let ((acc (if (eq? '() arg) arg (car arg)))
        (new-line (read-line)))
    (if (eof-object? new-line) acc
        (file->mem-info (add-line new-line acc)))))

(define (read-mem-info db)
  (with-input-from-file db
    file->mem-info))

(define (get mem-info  key factor)
  (/ (assoc-ref mem-info key)
     (expt 2 (assq-ref factors factor))))

(define (print-statistics mem-info factor)
  (let* ((total (get mem-info "MemTotal:" factor))
         (free (get mem-info "MemFree:" factor))
         (cached (get mem-info "Cached:" factor))
         (buffers (get mem-info "Buffers:" factor))
         (used (- total free cached buffers)))
    (format #t "Memory Total ~s ~s~%" total factor )
    (format #t "Memory Used: ~s ~s~%" used factor)
    (format #t "Memory Free: ~s ~s~%" free factor)
    (format #t "Memory Cached: ~s ~s~%" cached factor)
    (format #t "Memory Buffer: ~s ~s~%" buffers factor)))

(define (pick-factor-from . args)
  (cond
   ((= 1 (length args)) 'Gb)
   ((string= arg "-k") 'kb)
   ((string= arg "-m") 'Mb)
   ((string= arg "-t") 'Tb)
   (else 'Gb)))


(define (main args)
  (let ((factor (pick-factor-from args))
        (mem-info (read-mem-info db)))
    (print-statistics mem-info factor)))

Пример использования:

./libre.scm -g                                                                                                                                                                                             
Memory Total 3061475/65536 Gb
Memory Used: 7467491/262144 Gb
Memory Free: 142543/131072 Gb
Memory Cached: 1895025/131072 Gb
Memory Buffer: 703273/262144 Gb

Как видите, показатели памяти выражены приятными глазу рациональными числами и при этом они абсолютно точны. Можно начинать радоваться. Много не пейте!

Исправление ugoday, :

Меж тем аккурат под католическое рождество вышел libre-classic-ng 0.0.1, форк полулярного free-classic-ng, в котором были решены две главные проблемы оригиналы:

  • Нот инвентед хере (да её и на перле!)
  • Ужасные ошибки округления

Собственно, сама программа:

#!/usr/bin/guile \
-e main -s
!#

(use-modules (ice-9 rdelim))
(use-modules (ice-9 format))

(define db "/proc/meminfo")
(define factors '((kb . 0)
                  (Mb . 10)
                  (Gb . 20)
                  (Tb . 30)))

(define (parse-meminfo line)
  (filter
   (lambda (s)
     (not (string-null? s)))
   (string-split line #\Space)))

(define (add-line new-line acc)
  (let* ((key-value (parse-meminfo new-line))
         (key (car key-value))
         (value-in-kb (string->number (cadr key-value))))
    (acons key value-in-kb acc)))

(define (file->mem-info . arg)
  (let ((acc (if (eq? '() arg) arg (car arg)))
        (new-line (read-line)))
    (if (eof-object? new-line) acc
        (file->mem-info (add-line new-line acc)))))

(define (read-mem-info db)
  (with-input-from-file db
    file->mem-info))

(define (get mem-info  key factor)
  (/ (assoc-ref mem-info key)
     (expt 2 (assq-ref factors factor))))

(define (print-statistics mem-info factor)
  (let* ((total (get mem-info "MemTotal:" factor))
         (free (get mem-info "MemFree:" factor))
         (cached (get mem-info "Cached:" factor))
         (buffers (get mem-info "Buffers:" factor))
         (used (- total free cached buffers)))
    (format #t "Memory Total ~s ~s~%" total factor )
    (format #t "Memory Used: ~s ~s~%" used factor)
    (format #t "Memory Free: ~s ~s~%" free factor)
    (format #t "Memory Cached: ~s ~s~%" cached factor)
    (format #t "Memory Buffer: ~s ~s~%" buffers factor)))

(define (pick-factor-from . args)
  (cond
   ((= 1 (length args)) 'Gb)
   ((string= arg "-k") 'kb)
   ((string= arg "-m") 'Mb)
   ((string= arg "-t") 'Tb)
   (else 'Gb)))


(define (main args)
  (let ((factor (pick-factor-from args))
        (mem-info (read-mem-info db)))
    (print-statistics mem-info factor)))

Пример использования:

./libre.scm -g                                                                                                                                                                                             suite-saas-dev-eu
Memory Total 3061475/65536 Gb
Memory Used: 7467491/262144 Gb
Memory Free: 142543/131072 Gb
Memory Cached: 1895025/131072 Gb
Memory Buffer: 703273/262144 Gb

Как видите, показатели памяти выражены приятными глазу рациональными числами и при этом они абсолютно точны. Можно начинать радоваться. Много не пейте!

Исходная версия ugoday, :

Меж тем аккурат под католическое рождество вышел libre-classic-ng 0.0.1, форк полулярного free-classic-ng, в котором были решены две главные проблемы оригиналы:

  • Нот инвентед хере (да её и на перле!)
  • Ужасные ошибки округления

Собственно, сама программа:

#!/usr/bin/guile \
-e main -s
!#

(use-modules (ice-9 rdelim))
(use-modules (ice-9 format))

(define db "/proc/meminfo")
(define factors '((kb . 0)
                  (Mb . 10)
                  (Gb . 20)
                  (Tb . 30)))

(define (parse-meminfo line)
  (filter
   (lambda (s)
     (not (string-null? s)))
   (string-split line #\Space)))

(define (add-line new-line acc)
  (let* ((key-value (parse-meminfo new-line))
         (key (car key-value))
         (value-in-kb (string->number (cadr key-value))))
    (acons key value-in-kb acc)))

(define (file->mem-info . arg)
  (let ((acc (if (eq? '() arg) arg (car arg)))
        (new-line (read-line)))
    (if (eof-object? new-line) acc
        (file->mem-info (add-line new-line acc)))))

(define (read-mem-info db)
  (with-input-from-file db
    file->mem-info))

(define (get mem-info  key factor)
  (/ (assoc-ref mem-info key)
     (expt 2 (assq-ref factors factor))))

(define (print-statistics mem-info factor)
  (let* ((total (get mem-info "MemTotal:" factor))
         (free (get mem-info "MemFree:" factor))
         (cached (get mem-info "Cached:" factor))
         (buffers (get mem-info "Buffers:" factor))
         (used (- total free cached buffers)))
    (format #t "Memory Total ~s ~s~%" total factor )
    (format #t "Memory Used: ~s ~s~%" used factor)
    (format #t "Memory Free: ~s ~s~%" free factor)
    (format #t "Memory Cached: ~s ~s~%" cached factor)
    (format #t "Memory Buffer: ~s ~s~%" buffers factor)))

(define (pick-factor-from . args)
  (cond
   ((= 1 (length args)) 'Gb)
   ((string= arg "-k") 'kb)
   ((string= arg "-m") 'Mb)
   ((string= arg "-t") 'Tb)
   (else 'Gb)))


(define (main args)
  (let ((factor (pick-factor-from args))
        (mem-info (read-mem-info db)))
    (print-statistics mem-info factor)))

Пример использования:

Memory Total 3061475/65536 Gb
Memory Used: 7467491/262144 Gb
Memory Free: 142543/131072 Gb
Memory Cached: 1895025/131072 Gb
Memory Buffer: 703273/262144 Gb

Как видите, показатели памяти выражены приятными глазу рациональными числами и при этом они абсолютно точны. Можно начинать радоваться. Много не пейте!