sys-proctable 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/doc/linux.txt ADDED
@@ -0,0 +1,101 @@
1
+ == Description
2
+ sys-proctable
3
+
4
+ A Ruby version of the 'ps' command. This is a C extension, not parsed
5
+ output. For Linux, process information is read out of /proc.
6
+
7
+ == Synopsis
8
+ require 'sys/proctable'
9
+ include Sys
10
+
11
+ # Everything
12
+ ProcTable.ps{ |p|
13
+ puts p.pid.to_s
14
+ puts p.comm
15
+ ...
16
+ }
17
+
18
+ or
19
+
20
+ # Just one process
21
+ p = ProcTable.ps(2123)
22
+ puts p.pid.to_s
23
+ puts p.comm
24
+ ...
25
+
26
+ or
27
+
28
+ # Return the results as an array of ProcTableStructs
29
+ a = ProcTable.ps()
30
+ a.each do |p|
31
+ puts a.pid
32
+ ...
33
+ end
34
+
35
+ == Constants
36
+ VERSION
37
+ Returns the current version number for this package (as a string).
38
+
39
+ == Class Methods
40
+ ProcTable.fields
41
+ Returns a list of fields available on the current OS. May also take a
42
+ block.
43
+
44
+ ProcTable.ps(pid=nil)
45
+ ProcTable.ps{ |s| ... }
46
+ If no pid's or processes are included as arguments, in block form it
47
+ returns a struct of type ProcTableStruct for every process in the proc
48
+ table. Otherwise it returns an array of ProcTableStruct's.
49
+
50
+ If a process id is provided, a single ProcTable struct is returned, or
51
+ nil if the pid is not found.
52
+
53
+ == Exception Classes
54
+ ProcTableError < StandardError
55
+ Raised if the /proc field is unreadable and/or unmounted.
56
+
57
+ == Supported fields
58
+ You can view the supported fields with the "fields()" class method.
59
+
60
+ == Future Plans
61
+ Create a pure Ruby version as an alternative.
62
+ Change the ttynum field to ttydev and return a string instead of an int.
63
+
64
+ == Known Bugs
65
+ None known. Please log any bugs on the project page at
66
+ http://www.rubyforge.org/projects/sysutils
67
+
68
+ == License
69
+ Ruby's
70
+
71
+ == Copyright
72
+ (C) 2003-2005 Daniel J. Berger
73
+ All Rights Reserved
74
+
75
+ == Warranty
76
+ This package is provided "as is" and without any express or
77
+ implied warranties, including, without limitation, the implied
78
+ warranties of merchantability and fitness for a particular purpose.
79
+
80
+ == Author
81
+ Daniel J. Berger
82
+ djberg96 at yahoo dot com
83
+ rubyhacker1/imperator on IRC
84
+
85
+ == Credits
86
+ This module is largely based on the Perl module Proc::ProcessTable by
87
+ Dan Urist. Many ideas, as well as large chunks of code, were taken
88
+ from his work. So, a big THANK YOU goes out to Dan Urist.
89
+
90
+ A big thanks also goes out to Mike Hall who was very helpful with ideas,
91
+ logic and testing.
92
+
93
+ Thanks also go to Sean Chittenden for providing an account on one of his
94
+ FreeBSD machines. This is how the FreeBSD support was (initially) added.
95
+
96
+ Thanks go to James Hranicky for providing a patch that grabs name, eid,
97
+ euid, gid and guid info in the Linux version, along with some general
98
+ debugging help.
99
+
100
+ == See Also
101
+ ps, proc(5)
data/doc/solaris.txt ADDED
@@ -0,0 +1,120 @@
1
+ == Description
2
+ sys-proctable
3
+
4
+ A Ruby version of the 'ps' command. This is a C extension, not parsed
5
+ output. For Solaris, data is read out of /proc via the psinfo struct.
6
+
7
+ == Synopsis
8
+ require 'sys/proctable'
9
+ include Sys
10
+
11
+ # Everything
12
+ ProcTable.ps{ |p|
13
+ puts p.pid.to_s
14
+ puts p.comm
15
+ ...
16
+ }
17
+
18
+ or
19
+
20
+ # Just one process
21
+ s = ProcTable.ps(2123)
22
+ puts s.pid.to_s
23
+ puts s.comm
24
+ ...
25
+
26
+ # Return the results as an array of ProcTableStructs
27
+ a = ProcTable.ps
28
+ a.each do |p|
29
+ puts a.pid
30
+ ...
31
+ end
32
+
33
+ == Constants
34
+ VERSION
35
+ Returns the current version number for this package (as a string).
36
+
37
+ == Class Methods
38
+ ProcTable.fields
39
+ Returns a list of fields available on the current OS. May also take
40
+ a block.
41
+
42
+ ProcTable.ps(pid=nil)
43
+ ProcTable.ps{ |s| ... }
44
+ If no pid is included as an argument, in block form it
45
+ returns a struct of type ProcTableStruct for every process in the proc
46
+ table. Otherwise it returns an array of ProcTable struct's. If a pid
47
+ is provided it will return a single ProcTable struct for that pid, or
48
+ nil if it is not found.
49
+
50
+ == Exception Classes
51
+ ProcTableError < StandardError
52
+ Raised if the /proc directory is unreadable and/or unmounted.
53
+
54
+ == Supported fields
55
+ You can view the supported fields with the "fields()" class method.
56
+
57
+ == Future Plans
58
+ Return a more meaningful result for the wchan member (2.6+).
59
+ Add env info where possible.
60
+
61
+ == Notes
62
+ The "comm" field isn't really part of the psinfo struct. It is just a copy
63
+ (i.e. is identical to) the "fname" field. I added it to provide a degree
64
+ of consistency between all of the platforms. I will also make a point
65
+ of adding it to any future platform releases.
66
+
67
+ The cmdline string is limited to 80 characters, except for those processes
68
+ which you (or your program) own.
69
+
70
+ The ttydev field is, for now, an integer. If there is no associated tty with
71
+ the process, a -1 is returned. In the future, this field will be changed to
72
+ a string (i.e. the actual device name).
73
+
74
+ I suppose I *could* add a -lkvm version for Solaris (this is what Dan Urist
75
+ is now using in Proc::ProcessTable) but I haven't found a compelling reason
76
+ to do so. If you think you have one, please let me know.
77
+
78
+ == Known Bugs
79
+ If you're using Ruby 1.8.x there is a known issue with large file support.
80
+ There are only two solutions that I am aware of currently. You can either
81
+ rebuild Ruby with the --disable-largefile option or you can build a 64 bit
82
+ Ruby.
83
+
84
+ I have posted this issue to the mailing list, but have not received a
85
+ satisfactory response. I suspect there is an issue with the configure
86
+ script, because this does not happen with Ruby 1.6.x.
87
+
88
+ Please log any additional bugs on the SourceForge project page at
89
+ http://www.rubyforge.org/projects/sysutils
90
+
91
+ == License
92
+ Ruby's
93
+
94
+ == Copyright
95
+ (C) 2003-2005 Daniel J. Berger
96
+ All Rights Reserved.
97
+
98
+ == Warranty
99
+ This package is provided "as is" and without any express or
100
+ implied warranties, including, without limitation, the implied
101
+ warranties of merchantability and fitness for a particular purpose.
102
+
103
+ == Author
104
+ Daniel J. Berger
105
+ djberg96 at yahoo dot com
106
+ imperator/rubyhacker1 on IRC (Freenode)
107
+
108
+ == Credits
109
+ This module is largely based on the Perl module Proc::ProcessTable by
110
+ Dan Urist. Many ideas, as well as large chunks of code, were taken
111
+ from his work. So, a big THANK YOU goes out to Dan Urist.
112
+
113
+ A big thanks also goes out to Mike Hall who was very helpful with ideas,
114
+ logic and testing.
115
+
116
+ Thanks also go to Sean Chittenden for providing an account on one of his
117
+ FreeBSD machines. This is how the FreeBSD support was (initially) added.
118
+
119
+ == See Also
120
+ ps, proc
data/doc/top.txt ADDED
@@ -0,0 +1,54 @@
1
+ == Description
2
+ A simple 'top' interface for Ruby
3
+
4
+ == Prerequisites
5
+ Requires the "sys/proctable" package (which should be installed along
6
+ with this package).
7
+
8
+ == Synopsis
9
+ require "sys/top"
10
+ include Sys
11
+
12
+ Top.top(5).each{ |ps|
13
+ p ps
14
+ }
15
+
16
+ == Constants
17
+ VERSION
18
+ Returns the version number of this package as a String.
19
+
20
+ == Class Methods
21
+ Top.top(number=10, field="pctcpu")
22
+
23
+ Returns an array of ProcTableStruct's. The size of the array (i.e. the
24
+ number of processes) that it returns is based on +number+, and sorted by
25
+ +pctcpu+. By default, the size and field values are 10 and "pctcpu",
26
+ respectively.
27
+
28
+ == Notes
29
+ Not all fields are available on all platforms. Please check your
30
+ platform specific documentation for which fields are available.
31
+
32
+ I used sort() instead of sort_by() internally to maintain backward
33
+ compatability with Ruby 1.6.8, which I happen to need.
34
+
35
+ == Bugs
36
+ None that I'm aware of. Please log bug reports on the project page at
37
+ http://www.rubyforge.org/projects/sysutils
38
+
39
+ == License
40
+ Ruby's
41
+
42
+ == Copyright
43
+ (C) 2004-2005 Daniel J. Berger
44
+ All Rights Reserved.
45
+
46
+ == Warranty
47
+ This package is provided "as is" and without any express or
48
+ implied warranties, including, without limitation, the implied
49
+ warranties of merchantability and fitness for a particular purpose.
50
+
51
+ == Author
52
+ Daniel J. Berger
53
+ djberg96 at yahoo dot com
54
+ imperator/rubyhacker1 on IRC (Freenode)
data/doc/windows.txt ADDED
@@ -0,0 +1,122 @@
1
+ == Description
2
+ A Ruby interface for gathering process information. For MS Windows,
3
+ the process information is gathered via OLE + WMI, using pure Ruby.
4
+
5
+ == Synopsis
6
+ require 'sys/proctable'
7
+ include Sys
8
+
9
+ # Everything
10
+ ProcTable.ps{ |p|
11
+ puts p.pid.to_s
12
+ puts p.comm
13
+ ...
14
+ }
15
+
16
+ or
17
+
18
+ # A single pid
19
+ p = ProcTable.ps(1234)
20
+ puts p.pid.to_s
21
+ puts p.comm
22
+ ...
23
+
24
+ or
25
+
26
+ # Return the results as an array of ProcTableStructs
27
+ a = ProcTable.ps
28
+ a.each do |p|
29
+ puts a.pid
30
+ ...
31
+ end
32
+
33
+ == Constants
34
+ VERSION
35
+ Returns the current version number for this package (as a string).
36
+
37
+ == Class Methods
38
+ ProcTable.fields
39
+ Returns an Array of fields available on the current OS in the
40
+ ProcTableStruct.
41
+
42
+ ProcTable.ps(pid=nil, host='localhost')
43
+ ProcTable.ps{ |s| ... }
44
+ Returns a struct of type ProcTableStruct for every process in the proc
45
+ table in block form. Otherwise it returns an array of ProcTableStruct's.
46
+
47
+ If 'pid' is provided, then only a struct for that pid is returned, or
48
+ nil if it is not found.
49
+
50
+ If 'host' is provided, then processes from that host are gathered. By
51
+ default, process information is gathered on the local host.
52
+
53
+ == Supported fields
54
+ The currently supported fields for MS Windows (i.e. your ProcTable struct
55
+ members) are:
56
+
57
+ caption, cmdline, comm, creation_class_name, creation_date,
58
+ cs_creation_class_name, cs_name, description, executable_path,
59
+ execution_state, handle, handle_count, install_date, kernel_mode_time,
60
+ maximum_working_set_size, minimum_working_set_size, name,
61
+ os_creation_class_name, os_name, other_operation_count,
62
+ other_transfer_count, page_faults, page_file_usage, peak_virtual_size,
63
+ ppid, peak_working_set_size, priority, private_page_count, pid,
64
+ quota_non_paged_pool_usage, quota_paged_pool_usage,
65
+ quota_peak_non_paged_pool_usage, quota_non_paged_pool_usage,
66
+ read_operation_count, read_transfer_count, session_id,
67
+ termination_date, thread_count, user_mode_time, virtual_size,
68
+ windows_version, working_set_size, write_operation_count,
69
+ write_transfer_count
70
+
71
+ You can also view them with the fields() class method.
72
+
73
+ == Notes
74
+ For the sake of attempting to provide a somewhat common API, the 'comm'
75
+ and 'cmdline' fields have been included as part of the structure. The
76
+ 'comm' member corresponds to the Name attribute of Win32_Process. The
77
+ 'cmdline' attribute corresponds to either the Executable_Path attribute
78
+ (on Windows 2000 or earlier) or the CommandLine attribute (on Windows XP
79
+ and later).
80
+
81
+ Also note that the ProcessId and ParentProcessId attributes have been
82
+ abbreviated as 'pid' and 'ppid' in the struct members, again to keep the
83
+ members more consistent between platforms.
84
+
85
+ The "Mem Usage" and "VM Size" that you may be used to seeing in your Task
86
+ Manager window (probably) correspond to the 'working_set_size' and
87
+ 'page_file_usage' struct members, respectively, keeping in mind that
88
+ those values are in bytes, not kilobytes. I say 'probably' because
89
+ comments that I've read online indicate that it may not always line up
90
+ with what you see in the Task Manager, based on the current version (or
91
+ even Service Pack) of Windows that you are using.
92
+
93
+ == Future Plans
94
+ Possibly use the Win32_PerfFormattedData_PerfProc_Process class to get
95
+ additional process information.
96
+
97
+ == Known Bugs
98
+ Versions of Ruby earlier than 1.8.2 resulted in segfaults when trying to
99
+ run this code. You will likely encounter the same behavior.
100
+
101
+ Please log any additional bug reports on the project page at
102
+ http://www.rubyforge.org/projects/sysutils
103
+
104
+ == License
105
+ Ruby's
106
+
107
+ == Copyright
108
+ (C) 2003-2005 Daniel J. Berger
109
+ All Rights Reserved
110
+
111
+ == Warranty
112
+ This package is provided "as is" and without any express or
113
+ implied warranties, including, without limitation, the implied
114
+ warranties of merchantability and fitness for a particular purpose.
115
+
116
+ == Author
117
+ Daniel J. Berger
118
+ djberg96 at yahoo dot com
119
+ imperator/mok/rubyhacker1 on IRC (freenode)
120
+
121
+ == See Also
122
+ OLE + WMI
data/extconf.rb ADDED
@@ -0,0 +1,104 @@
1
+ #############################################################################
2
+ # Installation script for sys-proctable.
3
+ #
4
+ # By running this file, it is assumed that you want a C extension, and not
5
+ # a pure Ruby version. If you want a pure Ruby version (and you're on a
6
+ # platform for which it's supported), run install.rb instead.
7
+ #############################################################################
8
+ require "mkmf"
9
+ require "ftools"
10
+
11
+ c_file = nil
12
+ h_file = nil
13
+ tc_file = nil
14
+ lib_dir = "lib/os"
15
+
16
+ ########################################################################
17
+ # Ruby 1.8.3 and later mandates the use of rb_pid_t over pid_t because
18
+ # some libraries define their own pid_t. So, we check for that.
19
+ ########################################################################
20
+ have_type("rb_pid_t", "ruby.h")
21
+
22
+ ##########################################################################
23
+ # Determine appropriate source files based on platform. Also, check for
24
+ # certain header files and/or libraries on some platforms.
25
+ #
26
+ # On FreeBSD a different source file is used if the /proc filesystem is
27
+ # not found (kvm is used instead). For OpenBSD or NetBSD, the kvm
28
+ # interface is always used for now.
29
+ ##########################################################################
30
+ case RUBY_PLATFORM
31
+ when /hpux/i
32
+ c_file = "#{lib_dir}/hpux.c"
33
+ h_file = "#{lib_dir}/hpux.h"
34
+ tc_file = "test/tc_hpux"
35
+ when /freebsd/i
36
+ if File.exists?("/proc") && Dir["/proc/*"].length > 0
37
+ c_file = "#{lib_dir}/freebsd.c"
38
+ h_file = "#{lib_dir}/freebsd.h"
39
+ tc_file = "test/tc_freebsd"
40
+ else
41
+ have_library("kvm")
42
+ have_struct_member("struct kinfo_proc", "kp_proc", "sys/user.h")
43
+ have_struct_member("struct kinfo_proc", "kp_eproc", "sys/user.h")
44
+ c_file = "#{lib_dir}/bsd.c"
45
+ tc_file = "test/tc_kvm_bsd.rb"
46
+ end
47
+ when /openbsd|netbsd/
48
+ have_library("kvm")
49
+ c_file = "#{lib_dir}/bsd.c"
50
+ tc_file = "test/tc_kvm_bsd.rb"
51
+ when /solaris|sunos/i
52
+ c_file = "#{lib_dir}/sunos.c"
53
+ h_file = "#{lib_dir}/sunos.h"
54
+ tc_file = "test/tc_sunos"
55
+ have_header('procfs.h') # false means Solaris 2.5.x
56
+ when /linux/i
57
+ c_file = "#{lib_dir}/linux.c"
58
+ h_file = "#{lib_dir}/linux.h"
59
+ tc_file = "test/tc_linux"
60
+ when /darwin/i
61
+ c_file = "#{lib_dir}/darwin.c"
62
+ tc_file = "test/tc_darwin.rb"
63
+ when /windows|win32|cygwin|mingw|dos/i
64
+ msg = "Use the install_pure_ruby.rb script to install on MS Windows"
65
+ STDERR.puts msg
66
+ exit
67
+ else
68
+ puts "This platform not currently supported. Exiting..."
69
+ exit
70
+ end
71
+
72
+ ########################################################################
73
+ # Move any ".rb" files under 'lib/os/' to ".orig" to prevent mkmf from
74
+ # installing them during the 'make site-install' phase.
75
+ ########################################################################
76
+ Dir["lib/os/*.rb"].each{ |f|
77
+ File.rename(f,"lib/os/" + File.basename(f,".rb")+".orig")
78
+ }
79
+
80
+ ################
81
+ # build test.rb
82
+ ################
83
+ test_file = "test.rb"
84
+ File.open(test_file,"w+"){ |fh|
85
+ fh.puts "$LOAD_PATH.unshift Dir.pwd"
86
+ fh.puts "require \"test/tc_all\""
87
+ fh.puts "require \"#{tc_file}\""
88
+ fh.puts "require \"test/tc_top\""
89
+ }
90
+
91
+ ########################################################################
92
+ # Copy or link files to current directory for create_makefile to work.
93
+ ########################################################################
94
+ File.delete("proctable.c") if File.exists?("proctable.c")
95
+ File.delete("version.h") if File.exists?("version.h")
96
+ if h_file && File.exists?(File.basename(h_file))
97
+ File.delete(File.basename(h_file))
98
+ end
99
+
100
+ File.symlink(c_file,"proctable.c")
101
+ File.symlink(h_file,File.basename(h_file)) unless h_file.nil?
102
+ File.symlink("lib/version.h","version.h")
103
+
104
+ create_makefile("sys/proctable")