subexec 0.0.3 → 0.0.4
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/README.rdoc +2 -2
- data/VERSION +1 -1
- data/lib/subexec.rb +48 -31
- metadata +3 -6
data/README.rdoc
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.4
|
data/lib/subexec.rb
CHANGED
@@ -35,52 +35,69 @@ class Subexec
|
|
35
35
|
attr_accessor :exitstatus
|
36
36
|
|
37
37
|
def self.run(command, options={})
|
38
|
-
new(command, options)
|
38
|
+
sub = new(command, options)
|
39
|
+
sub.run!
|
40
|
+
sub
|
39
41
|
end
|
40
42
|
|
41
43
|
def initialize(command, options={})
|
42
44
|
self.command = command
|
43
45
|
self.timeout = options[:timeout] || -1 # default is to never timeout
|
44
|
-
run!
|
45
46
|
end
|
46
47
|
|
47
48
|
def run!
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
49
|
+
if timeout > 0 && RUBY_VERSION >= '1.9'
|
50
|
+
spawn
|
51
|
+
else
|
52
|
+
exec
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def spawn
|
60
|
+
r, w = IO.pipe
|
61
|
+
self.pid = Process.spawn(command, STDERR=>w, STDOUT=>w)
|
62
|
+
w.close
|
54
63
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
64
|
+
self.timer = Time.now + timeout
|
65
|
+
timed_out = false
|
66
|
+
|
67
|
+
loop do
|
68
|
+
begin
|
69
|
+
flags = (timeout > 0 ? Process::WUNTRACED|Process::WNOHANG : 0)
|
70
|
+
ret = Process.waitpid(pid, flags)
|
71
|
+
rescue Errno::ECHILD
|
72
|
+
break
|
73
|
+
end
|
74
|
+
|
75
|
+
break if ret == pid
|
76
|
+
sleep 0.01
|
77
|
+
if Time.now > timer
|
78
|
+
timed_out = true
|
79
|
+
break
|
80
|
+
end
|
61
81
|
end
|
62
82
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
83
|
+
if timed_out
|
84
|
+
# The subprocess timed out -- kill it
|
85
|
+
Process.kill(9, pid) rescue Errno::ESRCH
|
86
|
+
self.exitstatus = nil
|
87
|
+
else
|
88
|
+
# The subprocess exited on its own
|
89
|
+
self.exitstatus = $?.exitstatus
|
90
|
+
self.output = r.readlines.join("")
|
68
91
|
end
|
92
|
+
r.close
|
93
|
+
|
94
|
+
self
|
69
95
|
end
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
Process.kill(9, pid) rescue Errno::ESRCH
|
74
|
-
self.exitstatus = nil
|
75
|
-
else
|
76
|
-
# The subprocess exited on its own
|
96
|
+
|
97
|
+
def exec
|
98
|
+
self.output = `#{command} 2>&1`
|
77
99
|
self.exitstatus = $?.exitstatus
|
78
|
-
self.output = r.readlines.join("")
|
79
100
|
end
|
80
|
-
r.close
|
81
|
-
|
82
|
-
self
|
83
|
-
end
|
84
101
|
|
85
102
|
end
|
86
103
|
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: subexec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 25
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
7
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
8
|
+
- 4
|
9
|
+
version: 0.0.4
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Peter Kieltyka
|
@@ -15,7 +14,7 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date: 2010-
|
17
|
+
date: 2010-07-07 00:00:00 -04:00
|
19
18
|
default_executable:
|
20
19
|
dependencies: []
|
21
20
|
|
@@ -46,7 +45,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
46
45
|
requirements:
|
47
46
|
- - ">="
|
48
47
|
- !ruby/object:Gem::Version
|
49
|
-
hash: 3
|
50
48
|
segments:
|
51
49
|
- 0
|
52
50
|
version: "0"
|
@@ -55,7 +53,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
55
53
|
requirements:
|
56
54
|
- - ">="
|
57
55
|
- !ruby/object:Gem::Version
|
58
|
-
hash: 3
|
59
56
|
segments:
|
60
57
|
- 0
|
61
58
|
version: "0"
|