
Issue #20805 has been updated by alanwu (Alan Wu). It works if you make `shutdown_ractor` a constant: ```ruby p Process.pid SHUTDOWN_RACTOR = Ractor.new do Ractor.recv # Wait for a signal puts "goodbye" exit! end # Signal trap for SIGTERM Signal.trap("TERM") do puts "Received SIGTERM, shutting down..." SHUTDOWN_RACTOR.send(:shutdown) # Send the shutdown signal end sleep ``` ```shell ruby -v test.rb ruby 3.3.5 (2024-09-03 revision ef084cc8f4) [arm64-darwin24] 79270 test.rb:3: warning: Ractor is experimental, and the behavior may change in future versions of Ruby! Also there are many implementation issues. Received SIGTERM, shutting down... goodbye ``` Not to minimize the usability issue you experienced. ---------------------------------------- Feature #20805: Allow Ractor#send from a signal trap Proc https://bugs.ruby-lang.org/issues/20805#change-110242 * Author: kirs (Kir Shatrov) * Status: Open ---------------------------------------- It was surfaced in https://bugs.ruby-lang.org/issues/18139 that Ractor is designed to "unexpected interruption free" and it's not supposed to have a `kill`-like method. A better alternative to that would be allow the main Ractor to consume a shutdown signal from the pipe. Example: ```ruby shutdown_ractor = Ractor.new do Ractor.recv # Wait for a signal end # Signal trap for SIGTERM Signal.trap("TERM") do puts "Received SIGTERM, shutting down..." shutdown_ractor.send(:shutdown) # Send the shutdown signal end pipe = Ractor.new do loop do r, value = Ractor.select(Ractor.recv, shutdown_ractor) if r == shutdown_ractor # Shutdown signal received break else Ractor.yield(value, move: true) # Normal operation end end end ``` However, it's not possible to do `Ractor#send` from a trap Proc right now: ``` <internal:ractor>:282:in `new': can not isolate a Proc because it accesses outer variables (shutdown_ractor). (ArgumentError) ``` From what I've gathered, it makes it impossible to implement any graceful shutdown in a process with a few Ractors running. -- https://bugs.ruby-lang.org/