failed exited error code bash systemd

bash - exited - Arreglando un servicio systemd 203/EXEC falla(no existe tal archivo o directorio)



code exited status 203 exec gunicorn (3)

Estoy tratando de configurar un simple temporizador systemd para ejecutar un script de bash todos los días a la medianoche.

systemctl --user status backup.service falla y registra lo siguiente:

backup.service: Failed at step EXEC spawning /home/user/.scripts/backup.sh: No such file or directory. backup.service: Main process exited, code=exited, status=203/EXEC Failed to start backup. backup.service: Unit entered failed state. backup.service: Failed with result ''exit-code''.

Estoy perdido, ya que existen los archivos y directorios. El script es ejecutable y, solo para verificarlo, incluso he establecido permisos en 777.

Algunos antecedentes:

Los archivos de la unidad backup.timer y backup.service se encuentran en /home/user/.config/systemd/user .

backup.timer está cargado y activo, y actualmente espera la medianoche.

Esto es lo que parece:

[Unit] Description=Runs backup at 0000 [Timer] OnCalendar=daily Unit=backup.service [Install] WantedBy=multi-user.target

Aquí está backup.service :

[Unit] Description=backup [Service] Type=oneshot ExecStart=/home/user/.scripts/backup.sh [Install] WantedBy=multi-user.target

Y por último, esta es una paráfrasis de backup.sh :

#!/usr/env/bin bash rsync -a --delete --quiet /home/user/directory/ /mnt/drive/directory-backup/

El script se ejecuta bien si lo ejecuto yo mismo.

No estoy seguro de si es importante, pero uso fish como mi shell (empezado desde .bashrc).

Estoy feliz de publicar el script completo si eso es útil.


Creo que encontré la respuesta:

En el archivo .service , necesitaba agregar /bin/bash antes de la ruta al script.

Por ejemplo, para backup.service:

ExecStart=/bin/bash /home/user/.scripts/backup.sh

Opuesto a:

ExecStart=/home/user/.scripts/backup.sh

No estoy seguro de por qué. Tal vez el fish . Por otro lado, tengo otro script en ejecución para mi correo electrónico, y el archivo de servicio parece funcionar bien sin /bin/bash . Sin embargo, usa default.target lugar de multi-user.target .

La mayoría de los tutoriales que encontré no completan /bin/bash , pero luego vi esta respuesta SO que la tenía , y pensé que valía la pena intentarlo.

El archivo de servicio ejecuta la secuencia de comandos, y el temporizador se incluye en systemctl --user list-timers , así que espero que esto funcione.

Actualización: Puedo confirmar que todo está funcionando ahora.


Cuando esto me sucedió fue porque mi secuencia de comandos tenía finales de línea de DOS, lo que siempre desordena la línea shebang en la parte superior de la secuencia de comandos. Lo cambié a finales de línea de Unix y funcionó.


En realidad, utilicé la respuesta de ¿Cómo ejecuto una aplicación node.js como un servicio en segundo plano? combinado con lo que dwrz dijo anteriormente. En mi caso, estaba creando un bot de Discord que necesitaba poder ejecutarse cuando no estaba cerca.

Con este servicio implementado, inicialmente tuve el mismo error que el cartel inicial, lo que me trajo aquí. Me faltaba el #!/usr/bin/env node en la parte superior de mi script node.js ejecutado.

Desde entonces, no hay problemas, aunque tengo la intención de ver qué más se puede extender al servicio en sí.