From: "Dan0042 (Daniel DeLorme)" Date: 2022-08-10T17:55:08+00:00 Subject: [ruby-core:109468] [Ruby master Bug#18911] Process._fork hook point is not called when Process.daemon is used Issue #18911 has been updated by Dan0042 (Daniel DeLorme). I want to make a very quick note that if the original proposal of callbacks had been accepted in #17795, it would have been possible to invoke the "after_in_child" callbacks from Process.daemon ---------------------------------------- Bug #18911: Process._fork hook point is not called when Process.daemon is used https://bugs.ruby-lang.org/issues/18911#change-98629 * Author: ivoanjo (Ivo Anjo) * Status: Closed * 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: