lucid.system system information and process monitoring

Author: Chris Zheng  (z@caudate.me)
Date: 29 June 2017
Repository: https://www.github.com/zcaudate/lucidity
Version: 1.3.13

lucid.system is a wrapper around the oshi project, a free JNA-based (native) operating system information library for Java.

1    Installation

Add to project.clj dependencies:

[im.chit/lucid.system "1.3.13"]

lucid.system contain basic methods for class checking and predicates.

(require '[lucid.system :as system])

2    API

2.1    Hardware



computer-system ^

returns specs of the current system

v 0.1
(defn computer-system
  []
  (-> (oshi.SystemInfo.)
      (.getHardware)
      (.getComputerSystem)
      (to-data)))
link
(computer-system) ;; => #sys{:baseboard {:manufacturer "Apple Inc." :model "SMC"}, ;; :firmware {:description "unknown", ;; :manufacturer "Apple Inc.", ;; :name "EFI", ;; :version "MBP114.0172.B13"}, ;; :manufacturer "Apple Inc.", ;; :model "MacBook Pro (MacBookPro11,5)", :serial-number "C02RR24EG8WP"}

cpu ^

returns cpu information

v 0.1
(defn cpu
  []
  (-> (oshi.SystemInfo.)
      (.getHardware)
      (.getProcessor)
      (to-data)))
link
(cpu) ;; => #cpu{:vendor "GenuineIntel", ;; :physical-processor-count 4, ;; :system-serial-number "C02RR24EG8WP", ;; :system-cpu-load 0.03085702451764327, :family "6", ;; :logical-processor-count 8, ;; :name "Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz", ;; :system-cpu-load-between-ticks 0.04217839588279096, ;; :cpu64bit? true, ;; :identifier "Intel64 Family 6 Model 70 Stepping 1", ;; :system-uptime 30980, :stepping "1", ;; :system-load-average 1.19970703125, ;; :vendor-freq 2500000000, :model "70"}

displays ^

returns display information

v 0.1
(defn displays
  []
  (-> (oshi.SystemInfo.)
      (.getHardware)
      (.getDisplays)
      seq
      (to-data)))
link
(displays) ;; => (#display{:edid [0 -1 -1 -1 -1 -1 -1 0 6 16 46 -96 ... ;; ... ;; 0 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 ;; ... ;; 0 0 0 -48]})

fs ^

returns disk store information

v 0.1
(defn fs
  []
  (-> (oshi.SystemInfo.)
      (.getHardware)
      (.getDiskStores)
      seq
      (to-data)))
link
(fs) ;; => (#disk{:writes 157554, :write-bytes 4209285632, ;; :name "disk0", :transfer-time 8968912, ;; :size 500277790720, :serial "S29ANYAH561132" ;; :partitions [{:identification "disk0s1", :major 1, :minor 1, ;; :mount-point "", :name "EFI", :size 209715200, ;; :type "EFI System Partition"}] ;; :time-stamp 1487147164390, :read-bytes 3176375808, ;; :reads 132357, :model "APPLE SSD SM0512G"})

memory ^

returns memory information

v 0.1
(defn memory
  []
  (-> (oshi.SystemInfo.)
      (.getHardware)
      (.getMemory)
      (to-data)))
link
(memory) ;; => #memory{:available 4792446976, ;; :swap-total 0, ;; :swap-used 0, ;; :total 17179869184}

network-ifs ^

returns network interface information

v 0.1
(defn network-ifs
  []
  (-> (oshi.SystemInfo.)
      (.getHardware)
      (.getNetworkIFs)
      seq
      (to-data)))
link
(network-ifs) ;; => (#net{:packets-recv 0, :mtu 1484, :speed 10000000, ;; :macaddr "52:33:aa:41:86:27", ;; :packets-sent 28, :name "awdl0", :ipv4addr [], ;; :bytes-sent 6460, :out-errors 0, ;; :in-errors 0, :display-name "awdl0", ;; :ipv6addr ["fe80:0:0:0:5033:aaff:fe41:8627"], ;; :time-stamp 1487147416141, :bytes-recv 0})

power ^

returns power information

v 0.1
(defn power
  []
  (-> (oshi.SystemInfo.)
      (.getHardware)
      (.getPowerSources)
      seq
      (to-data)))
link
(power) ;; => (#power{:name "InternalBattery-0", ;; :remaining-capacity 1.0, ;; :time-remaining -2.0})

sensors ^

returns sensor information

v 0.1
(defn sensors
  []
  (-> (oshi.SystemInfo.)
      (.getHardware)
      (.getSensors)
      (to-data)))
link
(sensors) ;; => #sensors{:cpu-temperature 42.125, ;; :cpu-voltage 173798.992, ;; :fan-speeds [2163 1999]}

usb ^

returns usb information

v 0.1
(defn usb
  []
  (-> (oshi.SystemInfo.)
      (.getHardware)
      (.getUsbDevices false)
      seq
      (to-data)))
link
(usb) ;; => (#usb{:name "Apple Internal Keyboard / Trackpad", ;; :product-id "0274" ;; :vendor "Apple Inc."} ;; #usb{:name "Bluetooth USB Host Controller", ;; :product-id "8290", ;; :vendor "Broadcom Corp."})

2.2    OS



os ^

returns operating system information

v 0.1
(defn os
  []
  (-> (oshi.SystemInfo.)
      (.getOperatingSystem)
      (to-data)))
link
(os) ;; => #os{:family "macOS", ;; :file-system {:file-stores [{:description "Local Disk", :mount "/", ;; :name "Macintosh HD", ;; :total-space 499055067136, ;; :type "hfs", ;; :usable-space 458689961984, ;; :volume "/dev/disk1"}], ;; :max-file-descriptors 12288, ;; :open-file-descriptors 3396}, ;; :manufacturer "Apple", ;; :process-count 318, ;; :process-id 9317, ;; :thread-count 574, ;; :version {:build-number "16D32" ;; :code-name "Sierra", ;; :osx-version-number 12, ;; :version "10.12.3"}}

all ^

returns the entire map of the current system

v 0.1
(defn all
  []
  (binding [*raw* false]
    (to-data (oshi.SystemInfo.))))
link
(all) ;; =>

2.3    Process



process-id ^

returns the current process id

v 0.1
(defn process-id
  []
  (-> (oshi.SystemInfo.)
      (.getOperatingSystem)
      (.getProcessId)))
link
(process-id) ;;=> 9317

process ^

returns information about a process given it's id

v 0.1
(defn process
  [id]
  (-> (oshi.SystemInfo.)
      (.getOperatingSystem)
      (.getProcess id)))
link
(process 9317) ;; => #process{:parent-process-id 9314, ;; :path "/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/bin/java", ;; :kernel-time 7427, ;; :resident-set-size 1756151808, ;; :user-time 48685, ;; :virtual-size 8653258752, ;; :name "java", ;; :start-time 1487140389429, ;; :state "WAITING", ;; :thread-count 41, ;; :bytes-written 253952, ;; :priority 31, ;; :bytes-read 16384, ;; :up-time 7672182, ;; :process-id 9317}

list-processes ^

returns information about all running processes on the os

v 0.1
(defn list-processes
  ([] (list-processes 50 :cpu))
  ([limit] (list-processes limit :cpu))
  ([limit sort-key]
   (let [process-sort (fn [k] (-> (name k)
                                  (.toUpperCase)
                                  (object/from-data OperatingSystem$ProcessSort)))]
     (-> (oshi.SystemInfo.)
         (.getOperatingSystem)
         (.getProcesses limit (process-sort sort-key))
         seq
         (to-data)))))
link
;; ordering options: #{:name :oldest :memory :pid :newest :cpu :parentpid} (list-processes 2 :name) ;; => (#process{:parent-process-id 1, ;; :path "/System/Library/Frameworks/Accounts.framework/Versions/A/Support/accountsd", ;; :name "accountsd", ;; :bytes-read 4450304, ;; :up-time 31524268, ;; :process-id 1276} ;; #process{:parent-process-id 1, ;; :path "/Applications/Utilities/Activity Monitor.app/Contents/MacOS/Activity Monitor", ;; :name "Activity Monitor", ;; :bytes-read 61440, ;; :up-time 31522999, ;; :process-id 1360})