Ho creato questo file Unit in /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
Dalla riga di comando posso eseguire:
$ /usr/local/bin/start-menu-core-prices-update.sh
e il programma si avvia correttamente. Ma se avvio il demone:
$ sudo systemctl start menu-core-prices-update.service
Ottengo questo errore:
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
I permessi:
-rwxr-xr-x 1 root root 87 Jul 24 20:27 /usr/local/bin/start-menu-core-prices-update.sh
Risposta accettata:
Numero 1
Ho trovato questo thread intitolato:[Risolto] Aggiungi uno script personalizzato a systemd che ha lo stesso errore dell'output mostrato sopra, principalmente questo bit:
Impossibile generare il passaggio EXEC /usr/local/bin/start-menu-core-prices-update.sh:errore di formato Exec
Questo errore in genere significa che il tuo script presenta uno o più di questi problemi:
- Non è eseguibile
- Manca lo shebang (
#!/bin/bash
)
Per risolverli assicurati che il tuo script sia eseguibile:
$ chmod a+x /usr/local/bin/start-menu-core-prices-update.sh
E assicurati di aggiungere uno shebang, #!/bin/bash
verso l'alto.
Numero 2
Sembra che tu abbia un errore di battitura su questa riga:
After network.target = auditd.service
Probabilmente dovrebbe essere questo:
After=network.target auditd.service
Numero 3
Non mi è chiaro perché stai usando il Type = forking
. Quando usi questo tipo sei ExecStart=
è richiesto per utilizzare un metodo che chiama fork()
. Dovresti anche usare PIDFile=
opzione.
Mi aspetto che la tua applicazione Java funzioni bene con simple
o oneshot
. Vedi questo U&L Q&A intitolato:Forking in uno script di sistema per ulteriori informazioni su questo.