我们有一个名为的 NodeJs 应用程序应用程序在 Linux RHEL 机器上运行。我们使用节点启动服务永远在应用程序所在目录中的命令行上执行模块。
> cd /usr/app/dir
> forever start app.js
这很好,但现在我们想要应用程序.js系统重启后启动,所以我们创建了一个systemd服务文件似乎无法正常工作。
我希望有人能指出一些我没发现的明显问题。
/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
我意识到这是一个老问题,原帖者可能不再需要答案了。但万一有人像我一样偶然发现这个问题...
永久进程在启动实际node app.js
进程后退出。
由于您未指定服务Type=
,因此默认值为“简单”(因为您有ExecStart=
),这要求主进程继续运行。因此,当主“永久”进程停止时,systemd 认为它已失败,因为它不知道已生成子进程。
尝试Type=forking
在 下添加[Service]
。
作为systemd.service 文档状态:
如果设置为 forking,则预计使用 ExecStart= 配置的进程将在启动时调用 fork()。父进程预计退出当启动完成并且所有通信通道都已设置好时。孩子继续跑作为主服务进程,并且当父进程退出时,服务管理器将认为该单元已启动。