我們有一個名為的 NodeJs 應用程序應用程式.j在 Linux RHEL 機器上運作。我們使用節點啟動服務永遠應用程式所在目錄中命令列上的模組。
> cd /usr/app/dir
> forever start app.js
這工作得很好,但現在我們想要應用程式.js系統重新啟動後啟動,因此我們創建了一個系統服務文件似乎不起作用。
我希望有人能指出一些我沒有看到的明顯問題。
/etc/systemd/system/fulltext.service文件
[Unit]
Description=FullText Server NodeJS Script app.js
After=network.target
[Service]
Environment="NODE_ENV=lint"
Environment="PATH=/usr/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/slsuser/.local/bin:/home/slsuser/bin"
WorkingDirectory=/usr/share/eBSE/current/
ExecStart=/usr/bin/forever start /usr/app/dir/app.js
ExecStop=/usr/bin/forever stop /usr/app/dir/app.js
User=root
Group=root
[Install]
WantedBy=multi-user.target
執行時出現以下錯誤系統全文啟動
fulltext.service - FullText Server NodeJS Script app.js
Loaded: loaded (/etc/systemd/system/fulltext.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Oct 30 17:07:21 edc-v-slsftx01i04 forever[23421]: uid command script forever pid id logfile uptime
Oct 30 17:07:21 edc-v-slsftx01i04 forever[23421]: [0] gMOv /usr/bin/node /usr/app/dir/app.js 23415 23427 /root/.forever/gMOv.log 0:0:0:0.59
Oct 30 17:08:00 edc-v-slsftx01i04 systemd[1]: Started FullText Server NodeJS Script app.js.
Oct 30 17:08:00 edc-v-slsftx01i04 systemd[1]: Starting FullText Server NodeJS Script app.js...
Oct 30 17:08:01 edc-v-slsftx01i04 forever[23514]: warn: --minUptime not set. Defaulting to: 1000ms
Oct 30 17:08:01 edc-v-slsftx01i04 forever[23514]: warn: --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
Oct 30 17:08:01 edc-v-slsftx01i04 forever[23514]: info: Forever processing file: /usr/app/dir/app.js
Oct 30 17:08:01 edc-v-slsftx01i04 forever[23530]: info: Forever stopped process:
Oct 30 17:08:01 edc-v-slsftx01i04 forever[23530]: uid command script forever pid id logfile uptime
Oct 30 17:08:01 edc-v-slsftx01i04 forever[23530]: [0] dX9T /usr/bin/node /usr/app/dir/app.js 23524 23536 /root/.forever/dX9T.log 0:0:0:0.53
答案1
我意識到這是一個老問題,OP 可能不再需要答案。但以防萬一其他人像我一樣偶然發現這個...
永久進程在啟動實際node app.js
進程後退出。
由於您沒有指定 service Type=
,那麼預設值是「simple」(因為您有ExecStart=
),它期望主進程繼續運行。因此,當主「永遠」進程丟失時,systemd 認為它已經失敗,因為它不知道子進程已經生成。
嘗試Type=forking
在 下方新增[Service]
。
作為systemd.service 文檔狀態:
如果設定為 forking,則預期使用 ExecStart= 配置的程序將呼叫 fork() 作為其啟動的一部分。父進程預計退出啟動完成並且所有通訊通道均已建立時。孩子繼續跑作為主服務進程,服務管理員會認為父進程退出時啟動的單元。