3
[Service]
Type = forking
PIDFile = /var/run/learninglocker.pid
ExecStart = /usr/bin/npm  start
WorkingDirectory = /opt/learninglocker
User = root
Group = root
EnvironmentFile = /opt/learninglocker/environment
StandardOutput = syslog
StandardError = syslog
SyslogIdentifier = learninglocker
LimitCORE = infinity
LimitNOFILE = infinity
LimitNPROC = infinity
TimeoutStartSec = "2min 30s"

[Unit]
After = network.target

[Install]
WantedBy = multi-user.target

它是一个节点应用程序。

当我运行“npm start”时,它会被执行并运行四个不同的进程。但是,当我运行“systemctl start learninglocker.service”时,它运行了几秒钟[即活动(运行)]并失败,并且四个进程再次运行在后面。

我的问题是:我可以使用 Type = Simple 还是应该使用“forking”?

如果使用类型“forking”,服务将“失败”且没有错误消息。

4

1 回答 1

1

您可以在这篇文章中找到 Systemd 的 Simple、Forking 和其他启动选项之间的区别:https ://superuser.com/questions/1274901/systemd-forking-vs-simple/1274913

通常,如果您的启动脚本被阻塞,您必须使用简单,如果您的启动脚本在没有 systemd 帮助的情况下分叉自己,则必须使用分叉(这可能是您使用 npm start 的情况)。

此外,您可能必须在服务描述符中添加“RemainAfterExit=true”,以便 systemd 认为该服务仍在运行。您还需要定义一个 ExecStop 脚本,以便 systemd 知道如何停止您的服务。

您还可以参考此主题了解如何为 node js 定义 systemd 启动脚本。

于 2019-02-22T09:43:56.913 回答