Generador de Servicios systemd

Crea una unidad .service de systemd (ExecStart, User/Group, Restart, dependencias, entorno) más una unidad .timer como alternativa moderna a cron.

🌐 English

Environment variables

No environment variables yet — add one below.

Dependencies (other units)

"Start after" (ordering) and "requires it running" (a hard/soft dependency) are independent — set either, both, or neither per unit.

No dependencies yet — add one below.

my-service.service

Install it

🔒 Privado por diseño: todo funciona localmente en tu navegador; nada se sube nunca a ningún servidor.

Cómo generar un archivo de servicio systemd

  1. Rellena el nombre del servicio, una breve descripción, y el comando ExecStart (la ruta absoluta completa de lo que systemd debe ejecutar).
  2. Configura opcionalmente el directorio de trabajo, User/Group, el Type del servicio, y una política de reinicio con su retardo.
  3. Añade las variables de entorno y dependencias con otras unidades que necesites, elige “Start after” para el orden y un tipo de dependencia (suave/dura) de forma independiente, por cada unidad.
  4. Activa “Also generate a .timer unit” si quieres que este servicio se ejecute según una programación en vez de (o además de) al arrancar, y elige una programación de calendario o un retardo relativo al arranque.
  5. Copia o descarga el archivo .service (y, si lo has activado, .timer), y sigue después los comandos de instalación que aparecen al final.

Por qué un generador visual de archivos de unidad systemd

Un archivo de unidad systemd es un formato pequeño y bien definido (secciones [Unit]/[Service]/[Install], cada una una lista plana de líneas Clave=Valor]) pero acertar cada detalle a mano es fácil de hacer mal de forma sutil: olvidar daemon-reload tras editar un archivo, confundir Wants= con Requires=, escribir un ExecStart= relativo que falla en silencio, o recurrir a la sintaxis de cron en OnCalendar= donde no encaja. Esta herramienta construye cada sección a partir de las convenciones reales y documentadas de systemd, e incluye solo lo que realmente has pedido, así obtienes un archivo de unidad completo y correctamente ordenado en vez de parchear fragmentos de varias entradas de blog escritas para versiones distintas de systemd.

Type=, explicado

Type= le dice a systemd cómo saber que tu servicio realmente ha terminado de arrancar, acertar mal aquí es una razón habitual por la que un servicio parece “arrancado” al instante sin estarlo realmente (o al revés, cuando systemd espera para siempre a un proceso que ya se bifurcó y se independizó). simple (el valor por defecto) trata el propio proceso de ExecStart como el servicio en ejecución. forking es para el patrón clásico de demonio Unix donde el proceso se bifurca y el proceso original termina, systemd necesita saberlo para no considerar el servicio “detenido” en el instante en que el proceso padre termina. oneshot es para un script pensado para ejecutarse una vez y salir (una tarea de configuración, un backup) en vez de quedarse ejecutándose. notify es para un proceso que le indica explícitamente a systemd que está listo vía sd_notify(), la opción más precisa, pero solo funciona si el programa realmente la soporta. dbus espera a que el servicio adquiera un nombre D-Bus concreto. idle se comporta como simple pero espera cortésmente a que terminen otras tareas de arranque primero, útil sobre todo para evitar salidas de consola entremezcladas durante el arranque.

Timers frente a cron

La unidad .timer que esta herramienta puede generar junto a tu .service es el propio mecanismo de programación de systemd, una sintaxis genuinamente distinta de cron, no un simple maquillaje. Un timer de tipo calendario usa OnCalendar=, la gramática propia de systemd para expresiones de hora de reloj (daily, weekly, o una expresión completa como Mon *-*-1..7 02:00:00), los presets de esta herramienta generan las palabras clave reales que documenta el propio systemd, y avisan si una expresión personalizada parece sintaxis cron de 5 campos en vez de una expresión OnCalendar= real. Un timer relativo al arranque usa OnBootSec=/OnUnitActiveSec= (un retardo fijo tras el arranque, o tras la última vez que se ejecutó el servicio) para tareas que dependen del tiempo transcurrido en vez de una hora de reloj concreta. Persistent=true (solo timers de calendario) hace que una ejecución programada perdida se dispare en cuanto la máquina vuelve a estar encendida, en vez de saltársela en silencio como hace cron.

Instálalo correctamente

Cada archivo generado viene con los comandos reales para usarlo de verdad: copia el archivo en /etc/systemd/system/, ejecuta sudo systemctl daemon-reload para que systemd lo detecte, y luego sudo systemctl enable --now <nombre> para activarlo en futuros arranques y arrancarlo de inmediato. Cuando se genera un timer, solo se activa el .timer, el .service se dispara POR el timer, así que activar ambos sería redundante (y, para un script pensado para ejecutarse solo según una programación, podría hacer que también se ejecutara una vez de inmediato al arrancar si el servicio lleva su propio objetivo [Install] separado).

Sin peticiones al servidor, sin cuenta

Cada campo se combina en texto de archivo de unidad usando JavaScript normal que se ejecuta en tu navegador, no se sube nada, no hace falta cuenta, y esta herramienta no tiene acceso a una instancia real de systemd para probar el arranque del resultado. Eso también la hace honesta sobre sus límites: es un generador de sintaxis, no un validador. Comprueba siempre systemctl status y journalctl -u <nombre> después de instalar una unidad nueva.

Usos habituales

Cómo funciona, en imágenes

Captura de pantalla de la herramienta Generador de Servicios systemd con un generador de archivos de unidad con nombre del servicio, descripción y el comando ExecStart obligatorio, además de directorio de trabajo, usuario, grupo y tipo de servicio opcionales, que produce el archivo .service debajo
Generador de Servicios systemd en pleno proceso: un generador de archivos de unidad con nombre del servicio, descripción y el comando ExecStart obligatorio, además de directorio de trabajo, usuario, grupo y tipo de servicio opcionales, que produce el archivo .service debajo.
Diagrama: dónde ocurre el trabajo en una página de SysFenix que no tiene ninguna entrada de archivo: la herramienta llega como JavaScript normal dentro de la página, calcula la respuesta en tu propio dispositivo y la muestra ahí mismo, de modo que la subida, la cola y el registro en servidor que necesita una herramienta online típica no ocurren nunca
Dónde ocurre el trabajo en una página de SysFenix que no tiene ninguna entrada de archivo: la herramienta llega como JavaScript normal dentro de la página, calcula la respuesta en tu propio dispositivo y la muestra ahí mismo, de modo que la subida, la cola y el registro en servidor que necesita una herramienta online típica no ocurren nunca.

Preguntas frecuentes

¿La interfaz de esta herramienta está traducida al español?

En parte. La lógica de generación del archivo de unidad (las secciones [Unit]/[Service]/[Timer]/[Install], la distinción After=/Wants=/Requires=, la sintaxis OnCalendar=, el escapado de "%", la validación de ExecStart) es exactamente igual en ambos idiomas, el nombre del servicio, la descripción, la ruta del comando y cualquier otro texto que escribas puede estar en cualquier idioma. Pero el propio componente interactivo (etiquetas de los campos como "Service name"/"ExecStart", botones como "Copy"/"Download", los mensajes de aviso) es un único componente compartido escrito en inglés y se muestra igual en ambas versiones del sitio, sin traducir, la misma limitación ya documentada en otras herramientas interactivas de este sitio como el Editor de JSON o el Generador de README.

¿El archivo de unidad generado tiene garantizado que funcione?

Está construido a partir de la sintaxis real y correctamente documentada de systemd.service(5)/systemd.timer(5), verificada contra las páginas de manual reales mientras se construía esta herramienta, pero esta herramienta no tiene acceso a una instancia real de systemd para probar el arranque por ti, todo se ejecuta en tu navegador sin ninguna petición al servidor. Ejecuta siempre "sudo systemctl daemon-reload" y "sudo systemctl status <nombre>" después de instalarlo, y revisa "journalctl -u <nombre>" si no arranca como esperabas.

¿Cuál es la diferencia real entre After=, Wants= y Requires=?

Es uno de los puntos de confusión más habituales, así que esta herramienta mantiene deliberadamente los dos ejes por separado en vez de fundirlos en un solo control. After= (y su opuesto, Before=) controla SOLO el ORDEN de arranque, dice "arranca esta unidad solo después de que esa otra haya arrancado", pero no hace que la otra unidad arranque en absoluto, ni le importa si falla. Wants= es una dependencia SUAVE, intenta arrancar la otra unidad junto a esta, pero esta unidad arranca bien igualmente aunque esa falle o no exista. Requires= es una dependencia DURA, si la unidad requerida falla al arrancar (o se detiene después), esta unidad también se detiene. El patrón real más habitual y correcto es combinar el orden con una dependencia suave (After=network-online.target junto con Wants=network-online.target), que es exactamente lo que la casilla "Start after" más el selector de tipo de dependencia de esta herramienta te permiten construir, unidad por unidad.

¿Por qué ExecStart necesita una ruta absoluta?

El propio manual de systemd es más matizado que un simple "siempre absoluta", la primera palabra de ExecStart debe ser o bien una ruta absoluta (que empiece por "/") o un nombre de comando simple SIN ninguna barra (systemd busca entonces en un conjunto fijo de directorios compilado de antemano, algo parecido al PATH de una shell). Lo que realmente falla es una ruta RELATIVA que sí contiene una barra, como "./start.sh" o "scripts/run.sh", systemd no tiene concepto de "directorio actual" contra el que resolver eso, así que la unidad falla al arrancar. Esta herramienta marca ese caso como error, y sugiere amablemente la ruta completa incluso para un nombre de comando simple, ya que depender de la ruta de búsqueda compilada es una fuente habitual de sorpresas de "en mi máquina funciona" entre distintas distribuciones de Linux.

¿OnCalendar= es lo mismo que la sintaxis de cron?

No, y esto confunde constantemente. OnCalendar= de systemd usa su propia gramática de eventos de calendario, completamente distinta, "daily" (o, escrito por extenso, "*-*-* 00:00:00") significa lo mismo que "0 0 * * *" en cron, pero las dos sintaxis no son intercambiables, y pegar una donde se espera la otra hará que falle al analizarse o, peor, que signifique silenciosamente otra cosa. Los presets de programación de esta herramienta (hourly/daily/weekly/monthly) generan las palabras clave reales de systemd, y el campo personalizado te avisa si lo que has escrito parece sintaxis cron de 5 campos en lugar de una expresión OnCalendar= real.

¿Cuándo debería usar un .timer en vez de un trabajo de cron?

Un timer de systemd te da algunas ventajas reales que cron no tiene, también puede activarse por eventos relativos (como "15 minutos después de arrancar", vía OnBootSec=) y no solo por hora de reloj, sus ejecuciones aparecen en "systemctl list-timers" y en "journalctl -u <nombre>" junto a los registros de cualquier otra unidad (sin un log de cron aparte que buscar), Persistent=true puede recuperar automáticamente una ejecución perdida si la máquina estaba apagada a la hora programada (cron simplemente la salta en silencio), y puede depender de otras unidades de systemd como cualquier servicio. cron sigue siendo perfectamente válido para un trabajo recurrente simple y bien entendido, la unidad de timer de aquí merece la pena sobre todo cuando quieres esa integración más estrecha con el resto de systemd.

¿Esta herramienta envía algo a un servidor?

No. Cada campo que rellenas se combina en texto de archivo de unidad usando JavaScript normal que se ejecuta en tu pestaña del navegador, no hay petición a ninguna API, no hay cuenta, y nada sobre tu servicio (su comando, rutas, variables de entorno) sale nunca de tu dispositivo. Tu formulario en curso se guarda en el almacenamiento local de tu propio navegador únicamente para que sobreviva a una recarga accidental de la página; "Clear draft" lo borra.

Herramientas relacionadas