Skip to content

Instantly share code, notes, and snippets.

@vacax
Last active October 30, 2025 20:46
Show Gist options
  • Select an option

  • Save vacax/ac5a0f355176372008353d692b96f4aa to your computer and use it in GitHub Desktop.

Select an option

Save vacax/ac5a0f355176372008353d692b96f4aa to your computer and use it in GitHub Desktop.
Proceso de Systemd conectando un socket con un servicio

Script ejecutado por Socket

Nuestro ejemplo permité ejecutar un script cada cierto tiempo utilizando un servicio de una única ejecución en combinación con la unidad de timer.

Estaremos creando los siguientes archivos:

Copiar los archivos .service y timer en la ruta /etc/systemd/system/.

Ejecutar los siguientes comandos, para recargar los archivos de systemd y habilitar el timer:

sudo systemctl daemon-reload
sudo systemctl enable --now tcp_server.socket

Podemos ver los estatus:

sudo systemctl status tcp_server.socket

Para ver la información de los logs.

sudo journalctl -f -u ejecucion-por-tiempo.service
# Para probar
nc localhost 5555
# Ver la información en los archivos lo logs
#!/bin/bash
# tcp_server.sh — ejemplo de servidor gestionado por systemd socket
echo "[PID $$] Nueva conexión entrante..." >> /var/log/tcp_server.log
# Leer lo que envía el cliente desde stdin (el socket)
while read -r line; do
echo "[PID $$] Recibido: $line" >> /var/log/tcp_server.log
[[ "$line" == "exit" ]] && break
done
[Unit]
Description=Socket TCP para tcp_server.service
[Socket]
# escucha en el puerto TCP 5555.
ListenStream=5555
# systemd lanza una nueva instancia de tcp_server.service por cada conexión, debe ser una plantilla tener @.service. Si pones Accept=no, una sola instancia manejaría múltiples conexiones.
Accept=yes
[Install]
WantedBy=sockets.target
[Unit]
Description=Servidor TCP gestionado por systemd socket
[Service]
ExecStart=<<Ruta>>/tcp_server.sh
# systemd conecta el socket abierto al stdin del proceso.
StandardInput=socket
# salida se guarda en journalctl
StandardOutput=journal
# Error se guarda en journalctl
StandardError=journal
# No usamos el Type=simple porque systemd sabe cuándo arrancar el proceso al recibir una conexión.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment