web-dev-qa-db-fra.com

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

J'essaie de configurer un simple timer systemd pour exécuter un script bash tous les jours à minuit.

systemctl --user status backup.service échoue et enregistre les éléments 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, car les fichiers et les répertoires existent. Le script est exécutable et, pour vérifier, j'ai même défini des autorisations sur 777.

Quelques antécédents:

Les fichiers unitaires backup.timer et backup.service se trouvent dans /home/user/.config/systemd/user.

backup.timer est chargé et actif, et attend actuellement minuit.

Voici à quoi ça 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, ceci est une paraphrase de backup.sh:

#!/usr/env/bin bash

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

Le script fonctionne bien si je l'exécute moi-même.

Je ne sais pas si c'est important, mais j'utilise fish comme mon shell (commencé à partir de .bashrc).

Je suis heureux de poster le script complet si cela vous aide.

25
dwrz

Je pense avoir trouvé la réponse:

Dans le fichier .service, je devais ajouter /bin/bash avant le chemin du script.

Par exemple, pour backup.service:

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

Par opposition à:

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

Je ne sais pas pourquoi. Peut-être fish. D'autre part, un autre script est en cours d'exécution pour mon courrier électronique et le fichier de service semble fonctionner correctement sans /bin/bash. Cependant, il utilise default.target à la place de multi-user.target.

La plupart des tutoriels que j'ai rencontrés ne préfixent pas /bin/bash, mais j'ai ensuite vu cette SO réponse qui l'avait , et j'ai pensé que cela valait la peine d'essayer.

Le fichier de service exécute le script et le temporisateur est répertorié dans systemctl --user list-timers. J'espère que cela fonctionnera.

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

63
dwrz

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

5
ke4ukz

J'ai effectivement utilisé la réponse de Comment exécuter une application node.js en tant que service en arrière-plan? combiné avec ce que dwrz a dit ci-dessus. Dans mon cas, je créais un bot Discord qui devait pouvoir fonctionner lorsque je n'étais pas là.

Avec ce service en place, j'ai initialement eu la même erreur que l'affiche initiale, qui m'a amené ici. Il me manquait le #!/usr/bin/env node en haut de mon script node.js exécuté.

Depuis lors, pas de problèmes, bien que je compte voir ce qui peut être étendu au service lui-même.

1
Wirehead

Pour simplifier, veillez à ajouter un hash bang en haut de votre script ExecStart, c.-à-d.

#!/bin/bash

python -u alwayson.py    
0
crizCraig