sys-proctable 0.7.3

Sign up to get free protection for your applications and to get access to all the features.
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")