Назад | Перейти на главную страницу

NodeJS React Systemd Service не работает

Я пытаюсь настроить службу systemd для простого реагирующего приложения. Это приложение размещено в / home / myuser / test. И npm, и node находятся в PATH и жестко связаны с / usr / bin. Все файлы имеют разрешения для myuser: пользователя и группы myuser. Если я запустил это вручную с помощью npm start он запускается правильно и обслуживает приложение с http://localhost:3000

    Compiled successfully!

You can now view test in the browser.

  Local:            http://localhost:3000
  On Your Network:  http://myipaddress:3000

Note that the development build is not optimized.
To create a production build, use npm run build.

Если я пытаюсь запустить приложение через systemd, оно терпит неудачу, но не указывает причину. Я запускаю его с того же пути, с тем же пользователем и пробовал все возможные комбинации для ExecStart:

ExecStart=npm start
ExecStart=/usr/bin/npm start
ExecStart=/usr/bin/node /home/myuser/test/node_modules/react-scripts/scripts/start.js

Все они дают один и тот же результат, а именно: он "запускается" нормально, а вскоре после этого просто выходит из строя, без видимой причины в journalctl:

 $sudo systemctl status node-client   
 ● node-client.service - Node-React Frontend Server
   Loaded: loaded (/etc/systemd/system/node-client.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2020-04-08 09:46:10 UTC; 679ms ago
 Main PID: 18165 (node)
   CGroup: /system.slice/node-client.service
           └─18165 /usr/bin/node /home/myuser/test/node_modules/react-scripts/scripts/start.js

Apr 08 09:46:10 hostname systemd[1]: Started Node-React Frontend Server.
Apr 08 09:46:10 hostname systemd[1]: Starting Node-React Frontend Server...

А через несколько секунд ...

$sudo systemctl status node-client
● node-client.service - Node-React Frontend Server
   Loaded: loaded (/etc/systemd/system/node-client.service; disabled; vendor preset: disabled)
   Active: activating (auto-restart) since Wed 2020-04-08 09:46:00 UTC; 3s ago
  Process: 18142 ExecStart=/usr/bin/node /home/ec2-user/test/node_modules/react-scripts/scripts/start.js (code=exited, status=0/SUCCESS)
 Main PID: 18142 (code=exited, status=0/SUCCESS)

Я продолжаю получать следующее на journalctl

    -- Logs begin at Tue 2020-03-17 15:04:59 UTC, end at Wed 2020-04-08 09:48:23 UTC. --
Apr 08 09:48:22 hostname systemd[1]: Starting Node-React Frontend Server...
Apr 08 09:48:22 hostname systemd[1]: Started Node-React Frontend Server.
Apr 08 09:48:22 hostname systemd[1]: node-client.service holdoff time over, scheduling restart.
Apr 08 09:48:12 hostname nodeclient[18390]: Starting the development server...
Apr 08 09:48:12 hostname nodeclient[18390]: ℹ 「wds」: 404s will fallback to /
Apr 08 09:48:12 hostname nodeclient[18390]: ℹ 「wds」: Content not from webpack is served from /home/myuser/test/public
Apr 08 09:48:12 hostname nodeclient[18390]: ℹ 「wds」: webpack output is served from
Apr 08 09:48:12 hostname nodeclient[18390]: ℹ 「wds」: Project is running at http://myipaddress/
Apr 08 09:48:10 hostname systemd[1]: Starting Node-React Frontend Server...
Apr 08 09:48:10 hostname systemd[1]: Started Node-React Frontend Server.
Apr 08 09:48:10 hostname systemd[1]: node-client.service holdoff time over, scheduling restart.
Apr 08 09:48:00 hostname nodeclient[18368]: Starting the development server...
Apr 08 09:48:00 hostname nodeclient[18368]: ℹ 「wds」: 404s will fallback to /
Apr 08 09:48:00 hostname nodeclient[18368]: ℹ 「wds」: Content not from webpack is served from /home/myuser/test/public
Apr 08 09:48:00 hostname nodeclient[18368]: ℹ 「wds」: webpack output is served from
Apr 08 09:48:00 hosntame nodeclient[18368]: ℹ 「wds」: Project is running at http://myipaddress/

Служебный файл systemd со временем изменился, но ошибка была той же, независимо от ExecStart и других изменений, это содержимое на данный момент:

[Unit]
Description=Node-React Frontend Server
After=syslog.target network.target

[Service]
ExecStart=/usr/bin/node node_modules/react-scripts/scripts/start.js
Restart=always
RestartSec=10s
TimeoutSec=900
User=myuser
Group=myuser
Environment=PATH=/usr/bin:/usr/local/bin
WorkingDirectory=/home/myuser/test/
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=nodeclient

[Install]
WantedBy=multi-user.target

ОС - Centos7. Все тесты проводились с одним и тем же пользователем, без sudo, с одинаковыми командами как вручную, так и через systemd. Ручной запуск работает, systemd - нет.

Наконец, стоит упомянуть, что у меня есть приложение Express-NodeJS через systemd, и оно запускается правильно с той же конфигурацией systemd. Это не работает только с React.

Любая помощь будет принята с благодарностью!

Спасибо

Нисси

Я столкнулся с той же проблемой после обновления, моя служба systemd начинала выходить с кодом ошибки 0 каждый раз при запуске.

Это связано с февральским обновлением response-scripts start.js

Чтобы решить эту проблему, я закомментировал изменение, из-за которого start.js завершается при завершении stdin. Поскольку в службе нет ввода stdin, он существует до запуска приложения. Это находится в node-modules / response-scripts / scripts / start.js.

    if (isInteractive || process.env.CI !== 'true') {
      // Gracefully exit when stdin ends
      // process.stdin.on('end', function() {
      //   devServer.close();
      //   process.exit();
      // });
      process.stdin.resume();
    }

Изменение start.js для выхода при завершении stdin задокументировано в https://github.com/facebook/create-react-app/pull/7203/files/108bafe5d5b85c9544dd05b5ed42b4e90c66b2ca

Я решил это, добавив следующее в раздел [Service] моего файла .service:

StandardInput = tty-force