1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

rubyspec/core/io/popen_spec: avoid lingering "ruby -e sleep" process

The ruby_cmd helper blindly escapes code blocks passed to it,
causing "sleep" to be quoted in the command-line.  This quoting
results in IO.popen using a subshell (/bin/sh) to run the given
string command instead of invoking the Ruby executable directly.

Thus, IO.popen would only see the PID of the subshell via
IO#pid, and merely sending SIGKILL to the subshell would not
result in the child ("ruby -e sleep") being killed.

This problem with lingering ruby processes was easier to
reproduce on slow or heavily-loaded systems using low-scheduling
priority (e.g. "chrt -i 0 make test-rubyspec")

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58863 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
normal 2017-05-24 00:34:12 +00:00
parent 86c9a6d49b
commit 2e87ef8b66

View file

@ -74,8 +74,12 @@ describe "IO.popen" do
end end
it "does not throw an exception if child exited and has been waited for" do it "does not throw an exception if child exited and has been waited for" do
@io = IO.popen(ruby_cmd('sleep')) # Avoid the /bin/sh subshell using :options and :args to sleep.
Process.kill "KILL", @io.pid # We don't want to kill only the subshell and leave "ruby -e sleep"
# running indefinitely
@io = IO.popen(ruby_cmd(nil, :options => '-e', :args => 'sleep'))
pid = @io.pid
Process.kill "KILL", pid
@io.close @io.close
platform_is_not :windows do platform_is_not :windows do
$?.signaled?.should == true $?.signaled?.should == true