Skip to content

Different exit code for SIGKILL'ed processes with Spring #676

Open
@noizwaves

Description

@noizwaves

With Spring enabled, a Ruby command interrupted by a signal exits with a different exit code compared to that same command run with Spring disabled.

This issue was detected in our containerized development environments, which run inside of Docker. Because Docker enforces memory constraints by OOM'ing and SIGKILL'ing offending processes. The differing behavior can be observed in an application (Ruby 2.7.5, Rails 7.0.2.4, Spring 4.0.0) when forcing an OOM error:

Spring enabled:

$ bin/rails runner "arr = []; while true do; arr.push(1); end"
Running via Spring preloader in process 242
$ echo $?
0

Spring disabled:

$ DISABLE_SPRING=1 bin/rails runner "arr = []; while true do; arr.push(1); end"
Killed
$ echo $?
137

It looks like the status.exitstatus returned by Process.wait2 is nil for signaled processes, and the conversion to the corresponding unix/POSIX exit code for that signal is not done implicitly. exitstatus is returned directly by terminated processes here.

Could this conversion of signal to exit code be added?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions