88 votes

Correction d'un échec du service systemd 203 / EXEC (aucun fichier ni répertoire de ce type)

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 d'échec 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:

L' backup.timer et backup.service 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.

Vous ne savez pas si ça compte, mais j' fish que mon shell (commencé à partir .bashrc).

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

198voto

dwrz Points 1231

Je crois que j'ai trouvé la réponse:

Dans l' .service le fichier, j'ai besoin d'ajouter /bin/bash avant le chemin d'accès au script.

Par exemple, pour la sauvegarde.service:

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

Par opposition à:

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

Je ne sais pas pourquoi. Peut - fish. D'autre part, j'ai un autre script en cours d'exécution pour mon e-mail, et le fichier de service semble bien se passer, sans /bin/bash. Il n'utilisez default.target plutôt multi-user.target, cependant.

La plupart des tutoriels, je suis tombé sur de ne pas faire précéder /bin/bash, mais j'ai ensuite vu cette SORTE de réponse qui l'avait, et pensé qu'il valait la peine d'essayer.

Le service de fichier exécute le script, et le timer est répertorié en systemctl --user list-timers, donc j'espère que cela va fonctionner.

Mise à jour: je peux confirmer que tout fonctionne maintenant.

18voto

crizCraig Points 2041

Pour simplifier, assurez-vous d’ajouter un hash bang en haut de votre script ExecStart, c’est-à-dire

 #!/bin/bash

python -u alwayson.py    
 

10voto

ke4ukz Points 191

Lorsque cela m'est arrivé, c'est parce que mon script comportait des fins de ligne DOS, ce qui fausse toujours la ligne shebang en haut du script. Je l'ai changé pour les fins de ligne Unix et cela a fonctionné.

8voto

Ivan Savcic Points 64

S'il s'agit d'un copier / coller de votre script, vous avez permuté cette ligne:

 #!/usr/env/bin bash
 

Il n'y a pas #!/usr/env/bin , vous vouliez dire #!/usr/bin/env .

0voto

Wirehead Points 11

J'ai effectivement utilisé la réponse de Comment puis-je exécuter un node.js application comme un service d'arrière-plan? combiné avec ce que dwrz dit ci-dessus. Dans mon cas, j'ai été la création d'une Discorde bot qui devait être en mesure de s'exécuter lorsque je n'étais pas dans la.

Avec ce service en place, au départ, j'ai eu la même erreur que la première affiche a fait, qui m'a amené ici. J'ai été absent de l' #!/usr/bin/env node au dessus de mes exécuté node.js script.

Depuis, pas de problèmes, bien que j'ai l'intention de voir ce que peut être étendu pour le service lui-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X