systemd

Job for X.service failed because the control process exited with error code

systemctl start devuelve error y remite a systemctl status y journalctl. El mensaje en sí no contiene la causa: solo dice que el proceso terminó mal.

El motivo real está siempre en el journal de esa unidad. Es el primer comando, no el último.

Qué comprobar, y en qué orden

En el orden en que lo miramos nosotros. No es un ranking de frecuencia: no publicamos estadísticas que no hemos medido.

  1. 1

    El programa falla al arrancar por su propia configuración. El journal lo muestra literalmente.

    Comprobar

    sudo journalctl -u mi-servicio -n 50 --no-pager

    Corregir

    # Corregir lo que indique el journal y reintentar:
    sudo systemctl start mi-servicio
  2. 2

    ExecStart no es una ruta absoluta o el binario no existe. systemd no resuelve el PATH.

    Comprobar

    systemctl cat mi-servicio | grep ExecStart
    ls -l /ruta/al/binario

    Corregir

    # Poner la ruta absoluta en ExecStart y recargar:
    sudo systemctl daemon-reload
  3. 3

    El usuario del servicio no puede leer el directorio de trabajo o escribir donde necesita.

    Comprobar

    systemctl cat mi-servicio | grep -E 'User|WorkingDirectory'
    sudo -u el_usuario ls /ruta/de/trabajo

    Corregir

    sudo chown -R el_usuario:el_grupo /ruta/de/trabajo
  4. 4

    El endurecimiento de la unidad bloquea algo que el servicio necesita. ProtectSystem=strict deja el sistema en solo lectura salvo lo declarado.

    Comprobar

    systemd-analyze security mi-servicio

    Corregir

    # Declarar los directorios donde tiene que escribir en vez de quitar la
    # protección:
    #   ReadWritePaths=/var/lib/mi-servicio
  5. 5

    El Type no corresponde con lo que hace el proceso. Con Type=forking systemd espera que se bifurque; si no lo hace, da el arranque por fallido.

    Comprobar

    systemctl cat mi-servicio | grep Type

    Corregir

    # La mayoría de los servicios modernos no se demonizan: Type=simple.
    sudo systemctl daemon-reload && sudo systemctl start mi-servicio

Un detalle que ahorra tiempo

Tras editar cualquier fichero de unidad hace falta systemctl daemon-reload. Sin él systemd sigue usando la versión que tenía cargada, y el cambio parece no surtir efecto.

Los comandos de esta página se ejecutan en tu servidor y algunos modifican la configuración: léelos antes de pegarlos. Las rutas y los nombres de servicio varían entre distribuciones. Así se elabora este catálogo.