Zach Beane ([info]xach) wrote,
@ 2006-12-09 21:42:00
Previous Entry  Add to memories!  Tell a Friend  Next Entry
Entry tags:lisp

uptime

(defpackage #:zpb
  (:use #:cl)
  (:export #:uptime))

(in-package #:zpb)

(defun uptime-values ()
  (let ((seconds (truncate (get-internal-real-time)
                           internal-time-units-per-second)))
    (multiple-value-bind (days seconds)
        (truncate seconds 86400)
      (multiple-value-bind (hours seconds)
          (truncate seconds 3600)
        (multiple-value-bind (minutes seconds)
            (truncate seconds 60)
          (values days hours minutes seconds))))))

(defun uptime ()
  (multiple-value-bind (days hours minutes seconds)
      (uptime-values)
    (format t "~[~:;~:*~D days ~]~
               ~[~:;~:*~D hours ~]~
               ~[~:;~:*~D minutes ~]~
               ~[~:;~:*~D seconds~]~%"
            days hours minutes seconds)))

Here's my best uptime:

PK(13): (zpb:uptime)
146 days 7 hours 50 minutes 36 seconds

That's for PK Bass & Tackle. What's your best image uptime?

Update Oops. get-internal-real-time is not specified to start from 0, it just happens to do so on my implementation. Sorry!




(1 comment) - (Post a new comment)

Alternative version
(Anonymous)
2006-12-12 01:51 pm UTC (link)
I've had this in my various startup files since forever:

(let ((start-time (get-universal-time)))
  (defun uptime (&optional suppress-output)
    "Displays start time and current uptime for this lisp process. Or not.
Returns uptime in seconds."
    (let ((uptime (- (get-universal-time) start-time))
	  (days '("Mon" "Tue" "Wed" "Thu" "Fri" "Sat" "Sun")))

      (unless suppress-output
	;; Pretty print start time
	(multiple-value-bind
	      (second minute hour date month year day daylight-p zone)
	    (decode-universal-time start-time)
	  (flet ((tz-string (zone daylight-p)
		   (multiple-value-bind (hours mins)
		       (truncate (* zone 60) 60)
		     (when daylight-p
		       (setf hours (1- hours))) ; 1+ in the ISO world.
		     (let ((sign (if (minusp zone) ;ISO tz == -CL tz.
				     #\+
				     #\-)))
		       (format nil "~c~2,'0d~2,'0d" sign (abs hours) (abs mins))))))
	    (format t "~&Current image started: ~a, ~
~d-~2,'0d-~2,'0d ~
~2,'0d:~2,'0d:~2,'0d~
~a~%"
		    (nth day days)
		    year month date
		    hour minute second
		    (tz-string zone daylight-p))))

	;; Pretty print uptime
	(multiple-value-bind (days day-part)
	    (truncate uptime 86400)
	  (multiple-value-bind (hours min-secs)
	      (truncate day-part 3600)
	    (multiple-value-bind (minutes seconds)
		(truncate min-secs 60)
	      (format t "Uptime: ~d days ~2,'0d:~2,'0d:~2,'0d~%"
		      days hours minutes seconds)))))
      uptime)))


Gives output like

CL-USER> (uptime)
Current image started: Wed, 2006-11-29 16:15:25+0100
Uptime: 12 days 22:31:30
1117890


I only have this in development images for fun, not delivered apps.

...Peder...

(Reply to this)


(1 comment) - (Post a new comment)

Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…