簡體   English   中英

永遠使用時如何將節點應用程序作為systemd服務啟動?

[英]How to start node app as systemd service when it uses forever?

我是 node 的新手,並遵循了 Ryan Lewis 出色的 AWS 開發人員教程。 在該課程中,我們學習使用來自 AWS Marketplace 的 Bitnami Node.js 映像將 Node.js 應用程序部署到 AWS EC2。 為了練習一下,我想使用systemd將應用程序轉換為服務,以便在重新啟動后恢復。 但是,經過大量調試后,我發現該服務似乎一直在重新啟動,並且該應用程序從未上線。 這可能是由應用程序的啟動方式引起的。 它使用forever CLI 工具運行。 當我手動運行npm start ,我看到以下輸出:

npm start

> hbfl@1.0.0 prestart /home/bitnami/hamstercourse
> npm run build


> hbfl@1.0.0 build /home/bitnami/hamstercourse
> webpack

(node:19917) DeprecationWarning: Chunk.modules is deprecated. Use Chunk.getNumberOfModules/mapModules/forEachModule/containsModule instead.
Hash: aa4bec1a367d114f2c7f
Version: webpack 3.3.0
Time: 12349ms
             Asset     Size  Chunks                    Chunk Names
application.min.js   363 kB       0  [emitted]  [big]  application
    stylesheet.css  13.4 kB       0  [emitted]         application
  [10] ./node_modules/react-redux/es/index.js + 14 modules 37.6 kB {0} [built]
  [18] ./node_modules/react-router-dom/es/index.js + 13 modules 11.9 kB {0} [built]
  [59] ./node_modules/redux/es/index.js + 6 modules 21.3 kB {0} [built]
  [62] ./node_modules/react-router-redux/es/index.js + 4 modules 5.87 kB {0} [built]
 [105] ./app/index.jsx 1.86 kB {0} [built]
 [209] ./app/router.jsx 2.85 kB {0} [built]
 [211] ./app/routes/index.jsx 1.65 kB {0} [built]
 [287] ./app/reducers/index.js 316 bytes {0} [built]
 [288] ./app/reducers/hamsters.js 717 bytes {0} [built]
 [289] ./app/reducers/races.js 649 bytes {0} [built]
 [290] ./app/reducers/user.js 2.32 kB {0} [built]
 [291] ./app/reducers/leaderboards.js 355 bytes {0} [built]
 [292] ./app/reducers/status.js 285 bytes {0} [built]
 [293] ./app/index.less 41 bytes {0} [built]
 [326] ./node_modules/css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!./node_modules/less-loader/dist!./app/index.less 247 bytes [built]
    + 312 hidden modules
Child extract-text-webpack-plugin:
       [0] ./node_modules/css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!./node_modules/less-loader/dist!./app/index.less 247 bytes {0} [built]
        + 1 hidden module
Child extract-text-webpack-plugin:
       2 modules
Child extract-text-webpack-plugin:
       2 modules
Child extract-text-webpack-plugin:
       2 modules
Child extract-text-webpack-plugin:
       2 modules
Child extract-text-webpack-plugin:
       2 modules
Child extract-text-webpack-plugin:
       2 modules
Child extract-text-webpack-plugin:
       2 modules
Child extract-text-webpack-plugin:
       [0] ./node_modules/css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!./node_modules/less-loader/dist!./app/scenes/Config/index.less 485 bytes {0} [built]
        + 1 hidden module
Child extract-text-webpack-plugin:
       [0] ./node_modules/css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!./node_modules/less-loader/dist!./app/scenes/User/index.less 275 bytes {0} [built]
        + 1 hidden module
Child extract-text-webpack-plugin:
       [0] ./node_modules/css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!./node_modules/less-loader/dist!./app/scenes/Leaderboards/index.less 485 bytes {0} [built]
        + 1 hidden module
Child extract-text-webpack-plugin:
       [0] ./node_modules/css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!./node_modules/less-loader/dist!./app/scenes/Races/index.less 485 bytes {0} [built]
        + 1 hidden module
Child extract-text-webpack-plugin:
       [0] ./node_modules/css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!./node_modules/less-loader/dist!./app/scenes/Race/index.less 485 bytes {0} [built]
        + 1 hidden module
Child extract-text-webpack-plugin:
       [0] ./node_modules/css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!./node_modules/less-loader/dist!./app/scenes/Main/index.less 501 bytes {0} [built]
        + 1 hidden module
Child extract-text-webpack-plugin:
       [0] ./node_modules/css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!./node_modules/less-loader/dist!./app/scenes/Login/index.less 488 bytes {0} [built]
        + 1 hidden module
Child extract-text-webpack-plugin:
       [0] ./node_modules/css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!./node_modules/less-loader/dist!./app/scenes/Hamster/index.less 485 bytes {0} [built]
        + 1 hidden module
Child extract-text-webpack-plugin:
       [0] ./node_modules/css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!./node_modules/less-loader/dist!./app/scenes/Hamsters/index.less 617 bytes {0} [built]
        + 1 hidden module
Child extract-text-webpack-plugin:
       2 modules
Child extract-text-webpack-plugin:
       2 modules
Child extract-text-webpack-plugin:
       2 modules
Child extract-text-webpack-plugin:
       2 modules
Child extract-text-webpack-plugin:
       2 modules
Child extract-text-webpack-plugin:
       2 modules
Child extract-text-webpack-plugin:
       2 modules
Child extract-text-webpack-plugin:
       2 modules
Child extract-text-webpack-plugin:
       [0] ./node_modules/css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!./node_modules/less-loader/dist!./app/scenes/Main/Hero/index.less 827 bytes {0} [built]
        + 1 hidden module
Child extract-text-webpack-plugin:
       2 modules
Child extract-text-webpack-plugin:
       2 modules
Child extract-text-webpack-plugin:
       2 modules
Child extract-text-webpack-plugin:
       2 modules

> hbfl@1.0.0 start /home/bitnami/hamstercourse
> forever stopall && ./node_modules/.bin/forever start index.js

info:    No forever processes running
warn:    --minUptime not set. Defaulting to: 1000ms
warn:    --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
info:    Forever processing file: index.js

然后該進程進入后台,可以使用forever listforever stop等進行管理。正如這里所解釋的, systemd殺死后台進程(並且背后有很好的理由)。

為了證實我的懷疑,我嘗試像這樣運行服務:

[Unit]
Description=Node.js Hamster Http Server

[Service]
PIDFile=~/hamster-99.pid
User=bitnami
Group=bitnami
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
KillSignal=SIGQUIT
WorkingDirectory=/home/bitnami/hamstercourse
ExecStart=/opt/bitnami/nodejs/bin/node /home/bitnami/hamstercourse/index.js

[Install]
WantedBy=multi-user.target

啟用服務並重新加載守護進程后,輸出為:

hamster.service - Node.js Hamster Http Server
   Loaded: loaded (/etc/systemd/system/hamster.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2019-06-26 10:57:46 UTC; 28min ago
 Main PID: 19847 (.node.bin)
    Tasks: 11
   Memory: 26.8M
      CPU: 2.019s
   CGroup: /system.slice/hamster.service
           +-19847 /opt/bitnami/nodejs/bin/.node.bin /home/bitnami/hamstercourse/index.js

Jun 26 10:57:46 ip-172-31-35-115 systemd[1]: hamster.service: Main process exited, code=dumped, status=3/QUIT
Jun 26 10:57:46 ip-172-31-35-115 systemd[1]: Stopped Node.js Hamster Http Server.
Jun 26 10:57:46 ip-172-31-35-115 systemd[1]: hamster.service: Unit entered failed state.
Jun 26 10:57:46 ip-172-31-35-115 systemd[1]: hamster.service: Failed with result 'core-dump'.
Jun 26 10:57:46 ip-172-31-35-115 systemd[1]: Started Node.js Hamster Http Server.
Jun 26 10:57:48 ip-172-31-35-115 node[19847]: Server started at http://localhost:3000

所以好消息是:這實際上運行了服務。 歡呼! 但是,它跳過了npm start實際運行的許多基本步驟(例如縮小應用程序),並且它當然不會forever運行應用程序。 人們可能會討論在作為服務運行時是否需要使用像forever這樣的管理工具,但應該可以在不更改應用程序的情況下從systemd運行它,對吧? 那我該怎么做呢?

更新:

我剛剛找到https://unix.stackexchange.com/questions/308311/systemd-service-runs-without-exiting並嘗試在單元文件中使用Type=forking 這實際上似乎有效。 但這是方式嗎? 或者還有其他最佳實踐嗎?

我認為Type=forking是正確的。

https://www.freedesktop.org/software/systemd/man/systemd.service.html

如果設置為分叉,則預期使用 ExecStart= 配置的進程將調用 fork() 作為其啟動的一部分。 當啟動完成並且所有的通信通道都設置好后,父進程應該會退出。 子進程作為主服務進程繼續運行,服務管理器會在父進程退出時考慮單元啟動。 這是傳統 UNIX 服務的行為。 如果使用此設置,建議同時使用PIDFile=選項,以便systemd能夠可靠地識別服務的主進程。 一旦父進程退出,systemd 將繼續啟動后續單元。

這就是forever工作方式。 另請注意apache2服務也使用Type=forking

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM