J'ai créé ce fichier Unit dans /lib/systemd/system/menu-core-prices-update.service
:
[Unit]
Description = core-price-update daemon
After network.target = auditd.service
[Service]
Type = forking
ExecStart = /usr/local/bin/start-menu-core-prices-update.sh
ExecStop = /usr/local/bin/stop-menu-core-prices-update.sh
ExecReload = /usr/local/bin/reload-stop-menu-core-prices-update.sh
[Install]
WantedBy = multi-user.target
Depuis la ligne de commande, je peux exécuter :
$ /usr/local/bin/start-menu-core-prices-update.sh
et le programme démarre correctement. Mais si je lance le démon :
$ sudo systemctl start menu-core-prices-update.service
J'obtiens cette erreur :
Jul 24 21:10:20 localhost systemd[13655]: menu-core-prices-update.service: Failed at step EXEC spawning /usr/local/bin/start-menu-core-prices-update.sh: Exec format error
-- Subject: Process /usr/local/bin/start-menu-core-prices-update.sh could not be executed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- The process /usr/local/bin/start-menu-core-prices-update.sh could not be executed and failed.
--
-- The error number returned by this process is 8.
Jul 24 21:10:20 localhost systemd[1]: menu-core-prices-update.service: Control process exited, code=exited status=203
Jul 24 21:10:20 localhost systemd[1]: Failed to start core-price-update daemon.
-- Subject: Unit menu-core-prices-update.service has failed
Les autorisations :
-rwxr-xr-x 1 root root 87 Jul 24 20:27 /usr/local/bin/start-menu-core-prices-update.sh
Réponse acceptée :
Problème 1
J'ai trouvé ce fil intitulé :[Résolu] Ajouter un script personnalisé à systemd qui a la même erreur que votre sortie ci-dessus, principalement ce bit :
Échec à l'étape EXEC engendrant /usr/local/bin/start-menu-core-prices-update.sh :erreur de format Exec
Cette erreur signifie généralement que votre script présente un ou plusieurs des problèmes suivants :
- N'est pas exécutable
- Il manque le shebang (
#!/bin/bash
)
Pour résoudre ces problèmes, assurez-vous que votre script est exécutable :
$ chmod a+x /usr/local/bin/start-menu-core-prices-update.sh
Et assurez-vous d'ajouter un shebang, #!/bin/bash
vers le haut.
Problème 2
Il semble que vous ayez une faute de frappe sur cette ligne :
After network.target = auditd.service
Cela devrait probablement être ceci :
After=network.target auditd.service
Problème 3
Je ne comprends pas pourquoi vous utilisez le Type = forking
. Lorsque vous utilisez ce type, vous êtes ExecStart=
est nécessaire pour utiliser une méthode qui appelle fork()
. Vous êtes également supposé utiliser le PIDFile=
option.
Je m'attendrais à ce que votre application Java fonctionne correctement avec soit simple
ou oneshot
. Voir ce Q&A U&L intitulé :Forking dans un script systemd pour en savoir plus.