Your environment
ruby -v: ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x86_64-linux]
- daemons (1.4.1)
Describe the bug
Calling Process.waitpid inside the at_exit method will prevent the child process from stopping.
To Reproduce
Script:
Gemfile
# frozen_string_literal: true
source "https://rubygems.org"
gem "daemons"
test_daemon.rb
#!/usr/bin/env ruby
require 'bundler/setup'
Bundler.setup
require 'daemons'
at_exit do
begin
Process.waitpid
rescue Errno::ESRCH, Errno::ECHILD
end
end
2.times do |i|
Daemons.run_proc("test_daemon.#{i}") do
loop do
end
end
end
Terminal:
Child process doesn't stop.
$ ps aux
--snip--
sada 14719 1.8 0.2 177232 37168 pts/6 Sl+ 17:01 0:00 ruby ./test_daemon.rb start
sada 14735 0.0 0.2 177232 33832 ? Ssl 17:01 0:00 ruby ./test_daemon.rb start
sada 14737 94.6 0.2 180308 37540 ? Rl 17:01 0:08 test_daemon.0
The following fork operations are no longer possible.
- Forks another child process and exits first child. This prevents the potential of acquiring a controlling terminal.
|
# 1. Forks a child (and exits the parent process, if needed) |
|
# 2. Becomes a session leader (which detaches the program from |
|
# the controlling terminal). |
|
# 3. Forks another child process and exits first child. This prevents |
|
# the potential of acquiring a controlling terminal. |
|
# 4. Changes the current working directory to "/". |
|
# 5. Clears the file creation mask (sets +umask+ to 0000). |
|
# 6. Closes file descriptors (reopens +$stdout+ and +$stderr+ to point to a logfile if |
|
# possible). |
By the way, I encountered this problem when using delayed_job and debug.
Expected behavior
Child processes can be stopped.
Since the first child process should be stopped, I thought it would be a good idea to change the call to the exit! method.
Your environment
ruby -v: ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x86_64-linux]Describe the bug
Calling Process.waitpid inside the at_exit method will prevent the child process from stopping.
To Reproduce
Script:
Gemfile
test_daemon.rb
Terminal:
Child process doesn't stop.
The following fork operations are no longer possible.
daemons/lib/daemons.rb
Lines 43 to 51 in a0e84bc
By the way, I encountered this problem when using delayed_job and debug.
Expected behavior
Child processes can be stopped.
Since the first child process should be stopped, I thought it would be a good idea to change the call to the exit! method.
daemons/lib/daemons/daemonize.rb
Line 67 in a0e84bc