GNU/Linux >> Linux Esercitazione >  >> Linux

Il servizio Systemd non avvia Nodejs?

Sto cercando di avviare la mia app nodejs all'avvio. Funziona bene se lo avvio dalla riga di comando come utente odroid.

Ecco il mio file di servizio:

[Unit]
Description=ProImage
After=network.target mysql.service

[Service]
ExecStart=/bin/node //eadn-wc01-5196795.nxedge.io/proimage/app.js
Restart=on-failure
RootDirectory=/proimage
WorkingDirectory=/proimage
User=root

[Install]
WantedBy=multi-user.target

Quando corro:

sudo systemctl status proimage_daemon

Ottengo:

[email protected]:~$ sudo systemctl status proimage_daemon
● proimage_daemon.service - ProImage
   Loaded: loaded (/lib/systemd/system/proimage_daemon.service; enabled; vendor preset: enabled)
   Active: inactive (dead) (Result: exit-code) since Tue 2019-02-26 09:45:30 EST; 6s ago
  Process: 30797 ExecStart=/bin/node //eadn-wc01-5196795.nxedge.io/proimage/app.js (code=exited, status=200/CHDIR)
 Main PID: 30797 (code=exited, status=200/CHDIR)

Feb 26 09:45:29 odroid systemd[1]: proimage_daemon.service: Unit entered failed state.
Feb 26 09:45:29 odroid systemd[1]: proimage_daemon.service: Failed with result 'exit-code'.
Feb 26 09:45:30 odroid systemd[1]: proimage_daemon.service: Service hold-off time over, scheduling restart.
Feb 26 09:45:30 odroid systemd[1]: Stopped ProImage.
Feb 26 09:45:30 odroid systemd[1]: proimage_daemon.service: Start request repeated too quickly.
Feb 26 09:45:30 odroid systemd[1]: Failed to start ProImage.

Ho esaminato journalctl usando:

journalctl -u proimage_daemon.service

e mi dà lo stesso quanto segue:

[email protected]:~$ journalctl -u proimage_daemon.service --since 09:38
-- Logs begin at Tue 2019-02-26 09:02:47 EST, end at Tue 2019-02-26 10:02:34 EST. --
Feb 26 09:38:12 odroid systemd[1]: proimage_daemon.service: Trying to enqueue job proimage_daemon.service/stop/replace
Feb 26 09:38:12 odroid systemd[1]: proimage_daemon.service: Installed new job proimage_daemon.service/stop as 13040
Feb 26 09:38:12 odroid systemd[1]: proimage_daemon.service: Enqueued job proimage_daemon.service/stop as 13040
Feb 26 09:38:12 odroid systemd[1]: proimage_daemon.service: Job proimage_daemon.service/stop finished, result=done
Feb 26 09:38:12 odroid systemd[1]: Stopped ProImage ICU.
Feb 26 09:39:19 odroid systemd[1]: Started ProImage ICU.
Feb 26 09:39:19 odroid systemd[1]: proimage_daemon.service: Main process exited, code=exited, status=200/CHDIR
Feb 26 09:39:19 odroid systemd[1]: proimage_daemon.service: Unit entered failed state.
Feb 26 09:39:19 odroid systemd[1]: proimage_daemon.service: Failed with result 'exit-code'.
Feb 26 09:39:19 odroid systemd[1]: proimage_daemon.service: Service hold-off time over, scheduling restart.
Feb 26 09:39:19 odroid systemd[1]: Stopped ProImage ICU.

Ho esaminato una dozzina di post su questo problema. Dicono tutti che status=200/CHDIR indica un problema con la directory di lavoro.

Nel mio caso, la directory di lavoro esiste sicuramente ed è di proprietà di root. Ho impostato le autorizzazioni su 777 in modo ricorsivo su questa directory. Ho provato molte cose diverse con il file di servizio, tutte inutilmente.

Qualcuno ha un suggerimento su quale potrebbe essere il mio problema?

Risposta accettata:

Secondo la documentazione di systemd exec, impostando RootDirectory è simile a un chroot. In combinazione con l'impostazione di WorkingDirectory , significa che systemd sta eseguendo il chroot della tua app su /proimage e quindi tentare all'interno di quella directory su cd /proimage , che si tradurrebbe in /proimage/proimage .

Se non hai bisogno di eseguire il chroot del processo, elimina la RootDirectory direttiva. Se intendi eseguire il chroot del processo, elimina la WorkingDirectory direttiva.

Correlati:Ssh – Registrazione dei tentativi di accesso SSH?
Linux
  1. Gestisci l'avvio usando systemd

  2. Inizia a utilizzare systemd come strumento di risoluzione dei problemi

  3. Avvia, arresta e riavvia i servizi sul server Linux RHEL 7 systemd

  4. Aggiunta di un nuovo servizio a Linux systemd

  5. Avvia automaticamente il servizio OpenCA tramite Systemd in CentOS 7

Come avviare, arrestare o riavviare Apache

Comandi Systemctl per gestire il servizio Systemd

Gestire cgroup con systemd

systemd - Dando al mio servizio più argomenti

Come ottenere un timer di sistema dallo stato n/a?

Script di avvio postgresql di systemd