# Precreate the control FIFO
s6-mkfifo -m 0600 $S6_SCANDIR/.s6-svcan/control
background {
if {
# Block until s6-svscan starts reading its control FIFO
redir -w 8 $S6_SCANDIR/.s6-svcan/control
# Do not leak the fd
fdclose 8
s6-rc-init -c $S6_RC_COMPILED -l $S6_RC_LIVE $S6_SCANDIR
}
s6-rc $VERBOSE -l $S6_RC_LIVE -u change session
}
s6-svscan -st 0 $S6_SCANDIR
This is a bit "dirty" because it depends on s6-svscan internal, i.e. it
creates a FIFO named "control" in its .s6-svscan directory.
Yes, that should work, and yes, that's dirty, but you can't really do
any better. s6-rc(-init) assumes that an instance of s6-svscan is
already running on a scandir, and s6-svscan does not send any readiness
notification, so there will be a small race indeed, unless you use
such a pipe trick.
Adding readiness notification would be more bloat than it's worth,
since having to synchronize between s6-svscan and s6-rc-init only
happens
once.
The stage 1 script created by s6-linux-init-maker does something
comparable to your pipe trick, but it uses the fifo that s6-svscan's
logger reads from. When that fifo unblocks, not only is s6-svscan
already running, but it's also in its main loop and has already created
at least one service (its own logger), so it's a better readiness
guarantee.
--
Laurent