From: "ivoanjo (Ivo Anjo)" Date: 2022-07-22T09:10:40+00:00 Subject: [ruby-core:109298] [Ruby master Bug#18911] Process._fork hook point is not called when Process.daemon is used Issue #18911 has been updated by ivoanjo (Ivo Anjo). I've just opened https://github.com/ruby/ruby/pull/6170 to add the comment. Thanks @mame for going above and beyond in helping me with this :) ---------------------------------------- Bug #18911: Process._fork hook point is not called when Process.daemon is used https://bugs.ruby-lang.org/issues/18911#change-98435 * Author: ivoanjo (Ivo Anjo) * Status: Open * Priority: Normal * Assignee: akr (Akira Tanaka) * ruby -v: ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin20] * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN ---------------------------------------- Hello there! I'm working at Datadog [on the `ddtrace` gem](https://github.com/DataDog/dd-trace-rb), and we need to hook into fork operations to make sure that our products work correctly/automatically even in environments that fork. As part as #17795 a new `Process._fork` method was added to allow libraries and frameworks to easily hook into fork operations. I was investigating its use in `ddtrace` and noticed the following gap: the `Process.daemon` API internally makes use of `fork`, but the new hook point is not called for that API. Testcase: ```ruby puts RUBY_DESCRIPTION module ForkHook def _fork(*args) puts " #{Process.pid} Before fork!" res = super puts " #{Process.pid} After fork!" res end end Process.singleton_class.prepend(ForkHook) puts "#{Process.pid} Regular fork:" fork { exit } Process.wait puts "#{Process.pid} Process.daemon:" Process.daemon(nil, true) puts "#{Process.pid} Finishing!" ``` Testcase output: ``` ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin20] 48136 Regular fork: # <-- original process 48136 Before fork! 48136 After fork! # <-- original process 48137 After fork! # <-- child process 48136 Process.daemon: # <-- original process 48139 Finishing! # <-- forks and pid changes, but the hook isn't called ``` This was surprising to me since the advantage of this hook point would not not needing to hook into the many other places where `fork` can get called from. Thanks a lot :) -- https://bugs.ruby-lang.org/ Unsubscribe: