Size of running Tcl process

Phil Ehrens - UNIX only. This page was originally part of the Bag of algorithms.

 proc leakLogger { } {
      foreach { name pid pcpu pmem vsz rss } [ sysData ] { break }

      if { ! [ info exists ::memusage_t0 ] } {
         set     ::memusage_t0 [ clock seconds ]
         lappend ::memusage_t0 $vsz
         puts "inital size of $::argv0: $vsz Kb"
      }

      foreach { t0 x0 } $::memusage_t0 { break }
      set tn   [ clock seconds ]
      set xn $vsz
      set t    [ expr { $tn - $t0 } ]
      set leak [ expr { $xn - $x0 } ]
      if { $leak } {
         puts "LEAKED $leak Kb in $t seconds"
      }
      return {}
 }

 if {$tcl_platform(os) eq "SunOS" && $tcl_platform(osVersion) >= 5} {
    proc sysData {} {
       set data [exec /bin/ps -p [pid] -o "fname pid pcpu pmem vsz rss"]
       foreach datum [lrange [split $data "\n"] 1 end] {
          return $datum
       }
       puts stderr "Something's rotten in the state of Denmark..."
    }
 } else {
    proc sysData { } {
       set done 0
       set myname [ file tail $::argv0 ]
       set data [ exec ps -Ao "fname pid pcpu pmem vsz rss" ]
       set data [ lrange [ split $data "\n" ] 1 end ]
       foreach datum $data {
          foreach { name pid pcpu pmem vsz rss } $datum {
             if { [ regexp ^$name $myname ] || [ regexp ^$myname $name ] } {
                set done 1
                break
             }
          }
          if { $done } { break }
       }
       if { $done } {
          return $datum
       } else {
          puts stderr "dagnabbit, you're using that lame \"exec tclsh \"\$0\" \${1+\"\$@\"}\" thing, so this won't work!!"
       }
    } ;## -PSE
 }