xinetd je star „superstrežnik”: posluša na nastavljenih vratih, in ko prispe povezava, zažene pripadajoči program, ki prek povezave komunicira z odjemalcem. Tako so lahko omrežne storitve postali tudi preprosti programi, ki le berejo s standardnega vhoda in pišejo na standardni izhod.
Iz sistemov na osnovi Red Hat je xinetd izginil: v AlmaLinux 9 in 10 ni na voljo ne v sistemskih repozitorijih ne v EPEL (v preizkusu je dnf info xinetd v obeh vrnil odgovor „No matching Packages”). Če s starega strežnika seliš storitev, ki teče pod xinetd, jo moraš nastaviti kot vtičnico systemd. Systemd zna isto: na vratih posluša on in za vsako povezavo zažene program.
Korake smo preizkusili v sistemu AlmaLinux 10.2; enako deluje v vsaki distribuciji s systemd (Rocky Linux, Ubuntu, Debian).
Izhodiščna storitev xinetd
Tipična nastavitev xinetd v imeniku /etc/xinetd.d/:
service fontosapp
{
type = UNLISTED
port = 3662
socket_type = stream
protocol = tcp
wait = no
user = nobody
server = /usr/local/bin/fontosapp
disable = no
}
Posluša na vratih TCP 3662, za vsako povezavo kot uporabnik nobody zažene program /usr/local/bin/fontosapp in izpis programa pošlje odjemalcu. wait = no pomeni, da vsaka povezava dobi ločen proces.
1. Datoteka vtičnice
V systemd je del, ki posluša na vratih, datoteka .socket, na primer /etc/systemd/system/fontosapp.socket:
[Unit]
Description=Sajat alkalmazas socket
[Socket]
ListenStream=3662
Accept=yes
[Install]
WantedBy=sockets.target
Accept=yes ustreza nastavitvi xinetd wait = no: za vsako povezavo se zažene ločen primerek storitve.
2. Datoteka storitve
Del, ki zažene program, je datoteka /etc/systemd/system/fontosapp@.service. @ v imenu je obvezen: ob Accept=yes systemd iz te predloge za vsako povezavo zažene primerek, ime datoteke pa se mora ujemati z imenom vtičnice (fontosapp.socket → fontosapp@.service).
[Unit]
Description=Sajat alkalmazas kiszolgalo
[Service]
ExecStart=-/usr/local/bin/fontosapp
User=nobody
StandardInput=socket
ExecStart: celotna pot programa. Zaradi-na začetku systemd ne šteje za napako, če program konča s kodo, ki ni nič.User: ustreznik nastavitve xinetduser. Če pravice root niso potrebne, jih ne dodeli; primer teče z uporabnikomnobody.StandardInput=socket: vhod programa (in privzeto tudi izhod) bo omrežna povezava, kot pod xinetd.
3. Omogočanje in zagon
Omogočiti in zagnati je treba vtičnico, ne storitve:
sudo systemctl daemon-reload
sudo systemctl enable --now fontosapp.socket
systemctl status fontosapp.socket
Na vratih nato posluša systemd; v preizkusu je bil izpis sudo ss -tlnp | grep 3662 *:3662 … users:(("systemd",pid=1,…)).
4. Preizkus
Preprost testni program, ki izpiše ime računalnika in čas:
#!/bin/sh
echo "Szia, $(hostname)! Ido: $(date +%T)"
Povezava z vrati (namesto nc z vgrajeno možnostjo bash /dev/tcp, tako ni treba ničesar nameščati):
exec 3<>/dev/tcp/127.0.0.1/3662; cat <&3; exec 3<&-
V preizkusu je bil odgovor Szia, vps! Ido: 23:04:07, systemctl status fontosapp.socket pa je pokazal tudi število sprejetih povezav (Accepted: 1; Connected: 0;).
Če mora biti dosegljiva tudi od zunaj
Vtičnica posluša na vseh omrežnih vmesnikih. Če storitev uporabljaš le znotraj računalnika, v vrstico ListenStream vpiši lokalni naslov (ListenStream=127.0.0.1:3662). Če mora biti dosegljiva tudi od zunaj in teče firewalld, odpri vrata (sudo firewall-cmd --permanent --add-port=3662/tcp, nato sudo firewall-cmd --reload). Pri nestandardnih vratih se lahko vmeša tudi SELinux, glej: SELinux: zakaj dobim napako „Permission denied”?
O upravljanju storitev systemd govori članek Upravljanje storitev z ukazom systemctl, o njihovih dnevnikih pa članek o journalctl.