NodeJS反應系統服務不工作
我正在嘗試為一個簡單的反應應用程序設置一個 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 無效。
最後,提一下,我通過 systemd 擁有 Express-NodeJS 應用程序,並且它使用相同的 systemd 配置正確啟動。它只對 React 失敗。
任何幫助將不勝感激!
謝謝
尼西
升級後我遇到了同樣的問題,我的 systemd 服務每次啟動時都會以錯誤程式碼 0 退出。
這是由於 2 月對 react-scripts start.js 的更新
Kolega 的回答確實是解決此問題的最佳方法:
將 CI(持續集成)環境變數設置為 true。這可以在服務文件中完成:
Environment=CI=true
這是一個範例 .service 文件:
# Sample - My Sample Service file [Unit] Description=Sample - Sample Service to start a React server After=network.target [Service] Type=simple ExecStart=/usr/bin/npm start --prefix /home/pi/sample Environment=CI=true WorkingDirectory=/home/pi/sample StandardOutput=inherit StandardError=inherit Restart=no User=pi [Install] WantedBy=multi-user.target
如果上述方法對您有用,請投票贊成 Kolega 的答案。
我的原始解決方案如下,這需要更改以響應分發文件:
為了解決這個問題,我註釋掉了在標準輸入結束時使 start.js 退出的更改。由於服務沒有標準輸入,因此它在應用程序啟動之前就存在。這是在 node-modules/react-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 更改為退出記錄在https://github.com/facebook/create-react-app/pull/7203/files/108bafe5d5b85c9544dd05b5ed42b4e90c66b2ca