Estoy tratando de hacer que mi aplicación nodejs se inicie en el arranque. Funciona bien si lo inicio desde la línea de comandos como usuario odroid.
Aquí está mi archivo de servicio:
[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
Cuando ejecuto:
sudo systemctl status proimage_daemon
obtengo:
[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.
Miré journalctl usando:
journalctl -u proimage_daemon.service
y me da lo mismo lo siguiente:
[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.
He mirado una docena de publicaciones sobre este problema. Todos dicen que status=200/CHDIR indica un problema con el directorio de trabajo.
En mi caso, el directorio de trabajo definitivamente existe y es propiedad de root. Establecí los permisos en 777 recursivamente en este directorio. Probé muchas cosas diferentes con el archivo de servicio, todo fue en vano.
¿Alguien tiene alguna sugerencia sobre cuál puede ser mi problema?
Respuesta aceptada:
Según la documentación de systemd exec, configurando RootDirectory
es similar a un chroot. En combinación con la configuración de WorkingDirectory
, significa que systemd está haciendo chroot en tu aplicación a /proimage
y luego intentar dentro de ese directorio a cd /proimage
, que se traduciría a /proimage/proimage
.
Si no necesita chrootear el proceso, elimine el RootDirectory
directiva. Si tiene la intención de chrootear el proceso, elimine el WorkingDirectory
directiva.