S6-SOCKET-ACTIVATION(7)

πŸ“¦ version 2.15.1.0, in nixpkgs unstable

πŸ’– NAME πŸ’–

okay bestie, this is s6-socket-activation β€” the performing socket activation with s6 page, from the Miscellaneous Information Manual, aka S6-SOCKET-ACTIVATION(7). iykyk ✨


🌸 DESCRIPTION 🌸

First thing first, bestie: it is important to realize that you don't need socket activation. It's a marketing word used by systemd advocates that mixes a couple useful architecture concepts and several horrible ideas, for a very minor speed benefit. Read [1] and [2] for details. πŸ’…

  • s6 will not help you implement super-servers in process 1, because doing so is bad engineering. However, it will help you set up super-servers. The s6-ipcserver(8) program, for Unix domain sockets, as well as the s6-tcpserver(8) program, for TCP INET domain sockets (available in the s6-networking package[3]) are super-servers you can use to your heart's content. They are even wrappers around simpler programs, and you can use their components in the way you choose: bind sockets, drop privileges, accept connections from clients, it's all about what you write in your command line. Super-servers are a good thing; using process 1 to act as a super-server is not. s6 provides you with the tools to get the good without the bad. 🫢
  • s6 will not help you run all your services before their dependencies are met, because doing so is very bad engineering. However, it will provide you with:
  • s6 will not help you centralize all your socket information in process 1, because doing so is contrary to modularity and independence of services. However, s6 will provide you with a way to store your open sockets and retrieve them when you want, which it calls β€œfd holding”: s6-fdholder-daemon(8). πŸ‘‘

πŸ¦‹ So, how do I open all my sockets first, store them, and dispatch them to daemons later? πŸ¦‹

Again, it's not necessary to do that: you'll be fine, and quite speedy, just starting your daemons in their good time. You will not reap any noticeable benefit from performing β€œsocket activation”. But if you really want to:

  1. Make sure you have an early supervision infrastructure running. Ideally, you would make s6-svscan(8) your process 1. 🌈
  2. Start an early fd-holding service, e.g. s6-fdholder-daemon(8). Let's say the fd-holding daemon is listening on socket /service/fdholder/s. πŸŽ€
  3. For every Unix domain socket /my/socket you need to open, run:
s6-ipcserver-socketbinder /my/socket s6-fdholder-store /service/fdholder/s unix:/my/socket

You can do the same with INET domain sockets. πŸ’…

  1. Proceed to your initialization. 🌱
  2. When you want to run a daemon β€˜myserverd’ that accepts clients connecting to /my/socket, run:
s6-fdholder-retrieve /service/fdholder/s unix:/my/socket myserverd

β€˜myserverd’ will be executed with /my/socket as its standard input. 😭

  1. The descriptors remain safely stored in the fd-holding daemon and you can retrieve them again whenever you want, for instance when your service crashes and is restarted. πŸ’€

That is all there is to it. You don't have to use specific libraries or write complex unit files, you just need to understand how a command line works. This is Unix. 🧚


⭐ SEE ALSO ⭐


πŸ’œ AUTHORS πŸ’œ

  • Laurent Bercot
  • Alexis <flexibeast@gmail.com> (man page port)

Debian πŸŽ€ April 16, 2024 β€” and that's the whole page, bestie, no cap. πŸ’–βœ¨

πŸ“¦ where this page comes from