While running `rc-service start docker` on Gentoo, I found that the command does not start the service 90% of the time, with an enigmatic 'service crashed' message. The root cause of this is apparently rc-service spawning a pty, running start-stop-daemon inside that pty, and exitting, before start-stop-daemon child process calls setsid(), which results in the child process being killed with SIGHUP (SI_KERNEL). Theoretically this bug was present ever since the file was created in 5af58b45146a ("Rewrite the core parts in C. We now provide...") (or even before that), but it should have been only a minor issue before 45bd125dccdc ("Use a pty for prefixed output instead of pipes for..."). Not sure why nobody has had the issue so far (it has been present for almost 15 years). As here setsid() is the last call before execve(), the most natural locking mechanism is vfork(), as it gives back control to parent process only after execve() or process termination. So this way the bug can be fixed by adding a single letter. :-) Another way to ensure this would be using an O_CLOEXEC file descriptor or some custom lock, which would need to be released not before setsid(). Fixes: 5af58b45146a ("Rewrite the core parts in C. We now provide...") Fixes #532.
OpenRC README
OpenRC is a dependency-based init system that works with the
system-provided init program, normally /sbin/init
.
building and installing
OpenRC uses the meson build system, so use the usual methods for this build system to build and install.
Notes
We don't support building a static OpenRC with PAM.
PKG_PREFIX
should be set to where packages install to by default.
LOCAL_PREFIX
should be set to where user maintained packages are.
Only set LOCAL_PREFIX
if different from PKG_PREFIX
.
ROOTPREFIX
should be set when the root path is different from '/'.
rc
and rc.shutdown
are the hooks from the BSD init into OpenRC.
devd.conf
is modified from FreeBSD to call /etc/rc.devd
which is a
generic hook into OpenRC.
inittab
is the same, but for SysVInit as used by most Linux distributions.
This can be found in the support folder.
Obviously, if you're installing this onto a system that does not use OpenRC by default then you may wish to backup the above listed files, remove them and then install so that the OS hooks into OpenRC.
Discussions
We are testing discussions, so feel free to open topics there.
Reporting Bugs
Please report bugs on our bug tracker.
If you can contribute code , please feel free to do so by opening pull requests.
IRC Channel
We have an official irc channel, #openrc on the libera network. Please connect your irc client to irc.libera.chat and join #openrc on that network.