supervision - discussion about system services, daemon supervision, init, runlevel management, and tools such as s6 and runit
 help / color / mirror / Atom feed
* Readiness notification using signals
@ 2021-09-29 12:24 Carlos Eduardo
  2021-09-29 16:14 ` Laurent Bercot
  0 siblings, 1 reply; 2+ messages in thread
From: Carlos Eduardo @ 2021-09-29 12:24 UTC (permalink / raw)
  To: supervision

I'm supervising an instance of an X Server using s6.

X.Org has a built-in readiness notification mechanism: it sends a USR1
to its parent process once it's ready. From what I know, it would be
s6-supervise.

However, after reading the documentation, there doesn't seem to be a
way to set up custom USR1 handlers for s6-supervise. As far as I know,
this leaves me with two, not quite ideal solutions: make the run
script spawn X and do readiness notification on its behalf (which
lengthens the supervision chain), or poll it (which is what I've been
doing). Is there a way to not let the information from this USR1 not
"go to waste"?

Forgive me if I'm not seeing an obvious solution for this problem that
doesn't involve patching either software.

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Readiness notification using signals
  2021-09-29 12:24 Readiness notification using signals Carlos Eduardo
@ 2021-09-29 16:14 ` Laurent Bercot
  0 siblings, 0 replies; 2+ messages in thread
From: Laurent Bercot @ 2021-09-29 16:14 UTC (permalink / raw)
  To: Carlos Eduardo, supervision


  Hi Carlos,

>I'm supervising an instance of an X Server using s6.
>
>X.Org has a built-in readiness notification mechanism: it sends a USR1
>to its parent process once it's ready. From what I know, it would be
>s6-supervise.

  This... 😱 this is appalling.

  This mechanism is a terrible way to notify readiness.
  1. It forces the program reading readiness information to be the
direct parent of the daemon.
  2. This is not a concern for X, but if the daemon has dropped
privileges, it is very possible that it does not have the rights to
signal its parent anymore.
  3. It forces the parent to use the siginfo_t structure, and more
complex signal management, in order to detect what process is sending
the signal. This can work, but is by no means a common use of signals.
  4. Signals can be lost if several signals of the same value are
received by a process. So if two processes are notifying readiness at
the same time to a unique supervisor via SIGUSR1, it is possible that
the supervisor only gets one of them.


>However, after reading the documentation, there doesn't seem to be a
>way to set up custom USR1 handlers for s6-supervise.

  Indeed, there isn't. Signals are meant to be a control mechanism from
above, not from below: the administrator is supposed to be able to send
signals to s6-supervise, but the supervised process *definitely is not*.


>  As far as I know,
>this leaves me with two, not quite ideal solutions: make the run
>script spawn X and do readiness notification on its behalf (which
>lengthens the supervision chain), or poll it (which is what I've been
>doing). Is there a way to not let the information from this USR1 not
>"go to waste"?

  Let this "information" go to waste: it should never be sent in the
first place, and if patching were to happen, it should be to delete
that chunk of code from the Xorg server. We should consider ourselves
lucky that s6-supervise is not using SIGUSR1 for its own purposes and
is happily ignoring it as is.

  Fortunately, there is a different solution for you: the -displayfd 
option
to the X command will print the display number, followed by a newline,
to the (argument of -displayfd) file descriptor, when X has found a
display. This only happens when X is ready - unless it only starts
listening to its socket later, but the window should be super small; and
it has the correct format for an s6 notification.
  So, using displayfd as your notification fd will work.
  For instance, if you have 3 in your notification-fd file, starting
X -displayfd 3 should properly (or *almost* properly) notify readiness.
Some people already use that mechanism, and are happy with it. :)

  Good luck,

--
  Laurent


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-09-29 16:14 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-29 12:24 Readiness notification using signals Carlos Eduardo
2021-09-29 16:14 ` Laurent Bercot

supervision - discussion about system services, daemon supervision, init, runlevel management, and tools such as s6 and runit

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://inbox.vuxu.org/supervision

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V1 supervision supervision/ https://inbox.vuxu.org/supervision \
		subscribe@list.skarnet.org
	public-inbox-index supervision

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://inbox.vuxu.org/vuxu.archive.supervision.general


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git