Hallo zusammen,
Ich habe eine Verständnisfrage zur systemd socket activation. Szenario: ich habe eine Webanwendung - inklusive Webserver - implementiert (testwebserver tcp/80). Ich möchte, dass diese Anwendung gestartet wird, wenn ein Verbindungsaufbau zu tcp/80 gestartet wird.
my-www.service: [Service] User=root Group=root ExecStart=/usr/bin/testwebserver #PrivateNetwork=true
my-www.socket: [Socket] ListenStream=80 BindIPv6Only=both
[Install] WantedBy=sockets.target
systemctl start my-www.socket
Wenn ich nun mit z.b. curl auf port 80 zugreife, bekomme ich den Fehler
Jan 30 23:40:07 docker01 systemd[1]: my-www.socket: Failed with result 'service-start-limit-hit‘.
Jan 30 23:40:07 docker01 testwebserver[9105]: OSError: [Errno 98] Address already in use Jan 30 23:40:07 docker01 systemd[1]: my-www.service: Main process exited, code=exited, status=1/FAILURE
Der testwebserver Dienst versucht sich auf port 80 zu binden, wo ja bereits der systemd läuft und fällt dann um.
Frage1: Ich hatte das Beispiel: https://freedesktop.org/wiki/Software/systemd/DaemonSocketActivation/ vom nginx vorher geprüft und lief super. Ich weiss nicht so recht wo der Unterschied zu meinem Szenario ist. Ist der nginx socket-aware?! Was muss man hierfür implementieren?
Frage2: ist es eigentlich möglich, den per socket activation gestarteten Dienst nach Inaktivität wieder zu stoppen? Ich hatte zwar nen ganzen Sack voll Parameter gefunden (https://www.freedesktop.org/software/systemd/man/latest/systemd.socket.html), aber irgendwie scheint nichts so richtig zu passen..
Danke und Gruss,
Andreas
Hallo,
On Tue, Jan 30, 2024 at 11:50:37PM +0100, Andreas Roth wrote:
my-www.socket: [Socket] ListenStream=80 BindIPv6Only=both
[Install] WantedBy=sockets.target
systemctl start my-www.socket
Wenn ich nun mit z.b. curl auf port 80 zugreife, bekomme ich den Fehler
Jan 30 23:40:07 docker01 systemd[1]: my-www.socket: Failed with result 'service-start-limit-hit‘.
Jan 30 23:40:07 docker01 testwebserver[9105]: OSError: [Errno 98] Address already in use Jan 30 23:40:07 docker01 systemd[1]: my-www.service: Main process exited, code=exited, status=1/FAILURE
Der testwebserver Dienst versucht sich auf port 80 zu binden, wo ja bereits der systemd läuft und fällt dann um.
Ja, das bind(2) macht systemd, das kannst Du nicht nochmal machen. Dein Programm bekommt bloss den filedescriptor. Entweder im State "Listen" dann musst Du accept(2) machen oder nach dem accept (siehe https://www.freedesktop.org/software/systemd/man/latest/systemd.socket.html - Option Accept=) dann wird eine Instanz pro eingehender Connection gestartet.
Unter https://www.freedesktop.org/software/systemd/man/latest/sd_listen_fds.html# findest Du wie Du an den Filedescriptor dran kommst.
Grüsse Andreas
lug-dd@mailman.schlittermann.de