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.
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.
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é.
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.
Pour simplifier, veillez à ajouter un hash bang en haut de votre script ExecStart, c.-à-d.
#!/bin/bash
python -u alwayson.py