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.
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
Vous devez vous connecter pour publier un commentaire.
Je crois que j'ai trouvé la réponse:
Dans le
.service
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-être
fish
. D'autre part, j'ai un autre script en cours d'exécution pour mon e-mail, et le fichier de service semble fonctionner correctement sans/bin/bash
. Il n'utilisezdefault.target
au lieumulti-user.target
.La plupart des tutoriels, je suis tombé sur de ne pas faire précéder de
/bin/bash
, mais j'ai ensuite vu ceci AFIN de répondre à qui il avait, et pensé qu'il valait la peine d'essayer.Le service de fichier exécute le script, et le timer est répertorié dans
systemctl --user list-timers
, donc j'espère que cela va fonctionner.Mise à jour: je peux confirmer que tout fonctionne maintenant.
ce travail autour est super gênant, l'écriture d'un
#!
ligne indique au noyau de ce que l'interprète à utiliser, maintenant, je dois miroir cette information dans un fichier unité pour les applications qui ne sont pas des singletons -_- ce queMême lorsque le fichier exécutable n'est pas un script bash, comme dans mon cas,
jupyter
sur CentOS 7,/bin/bash -c "..."
est nécessaire. Je pense que c'est parce que c'est un script python, et il a un beau spectacle de python au tout début.OriginalL'auteur dwrz
Lorsque cela s'est produit pour moi, c'était parce que mon script a DOS les fins de ligne, qui toujours finit par brouiller la ligne shebang en haut du script. Je l'ai changé pour des fins de ligne Unix et cela a fonctionné.
Vous avez sauvé ma vie! J'ai juste ajouté
#!/usr/bin/env bash
à la première ligne de la.sh
ensuite travaillé.OriginalL'auteur ke4ukz
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. Les deux choses qui me manquait, c'était le #!/usr/bin/env nœud au sommet de ma exécuté node.js script, et le /bin/bash liste ci-dessus qui semble permet au système de s'exécuter correctement.
Depuis, pas de problèmes, bien que j'ai l'intention de voir ce que peut être étendu pour le service lui-même.
OriginalL'auteur Wirehead