La fixation d'un service systemd 203/EXEC échec (aucun fichier ou répertoire)

Je suis en train de constituer un simple systemd minuterie pour exécuter un script bash tous les jours à minuit.

systemctl --user status backup.service échoue et les journaux suivants:

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'.

Je suis perdu, étant donné que les fichiers et répertoires existent. Le script est exécutable et, juste pour vérifier, j'ai même mis les permissions à 777.

Un peu de contexte:

La backup.timer et backup.service l'unité de fichiers sont situés dans /home/user/.config/systemd/user.

backup.timer est chargé et activé, et actuellement en attente de minuit.

Voici à quoi il ressemble:

[Unit]
Description=Runs backup at 0000

[Timer]
OnCalendar=daily
Unit=backup.service

[Install]
WantedBy=multi-user.target

Voici backup.service:

[Unit]
Description=backup

[Service]
Type=oneshot
ExecStart=/home/user/.scripts/backup.sh

[Install]
WantedBy=multi-user.target

Et enfin, c'est une paraphrase de l' backup.sh:

#!/usr/env/bin bash

rsync -a --delete --quiet /home/user/directory/ /mnt/drive/directory-backup/

Le script fonctionne très bien si j'exécute moi-même.

Ne sais pas si ça compte, mais j'utilise fish que mon shell (commencé à partir .bashrc).

Je suis heureux de publier le script intégral si c'est utile.

Ce n' ls -l /home/user/.scripts/backup.sh de sortie ? Le début de votre backup.sh le script a l'air très étrange: #!/user/env/bin bash , ne l'exécutable /user/env/bin existent réellement ? Êtes-vous sûr de ne pas dire /usr/bin/env ou /home/user/bin/env ?
ls sorties -rwxrwxrwx 1 dwrz dwrz 1470 Aug 11 01:57 /home/user/.scripts/backup.sh. Et mes excuses -- la faute dans le shebang était quand j'étais copier les choses ici. C'est /usr/ dans le script.
De côté: à Partir de poissons de .bashrc est un vraiment mauvaise idée. Mise à jour de votre /etc/passwd entrée pour spécifier directement le poisson, ne pas confondre les programmes qui peuvent intentionnellement souhaitez exécuter interactif bash exemple en le faisant démarrer un autre, incompatible shell à la place.
Comme pour la question immédiate à portée de main, j'aimerais commencer par reproduire avec Sysdig le traçage de l'exécution; de cette façon, vous pouvez trouver exactement les syscall qui échoue et extraire l'information pertinente (CHEMIN actif, uid, gid, etc).
BTW, il y a un PATH défini lors de votre service est invoqué? Si env bash ne pouvez pas trouver bash car il n'y a pas de PATH, qui serait la cause de votre bug. Réglage Environment=PATH=/bin:/usr/bin ou sinon une bonne valeur dans le .service ne ferait pas de mal.

OriginalL'auteur dwrz | 2017-08-19