为什么 systemd 进程在启动 foreman 服务器进程后就停止了?

为什么 systemd 进程在启动 foreman 服务器进程后就停止了?

我正在尝试使用 foreman 导出一个简单的 Ruby 应用程序。基于其用法对于 systemd,我做的事情似乎是正确的。

但是,当我启动目标/服务时,我收到如下状态消息:

systemd[1]: Starting app-web-1.service...
systemd[1]: Started app-web-1.service.
systemd[1]: Service app-web-1.service is not needed anymore. Stopping.
systemd[1]: Stopping app-web-1.service...
systemd[1]: Stopped app-web-1.service.

这个过程开始了,然后结束了。我不知道为什么会发生这种情况。

当然,我不是 systemd 专家。这是我第一次处理服务脚本,所以我不确定生成的文件中是否存在导致此问题的原因。

通过 foreman 导出时,会创建一些目标和服务文件。因此,我必须处理一些文件。

以下是app.target的内容:

[Unit]
StopWhenUnneeded=true
Wants=app-web.target

[Install]
WantedBy=multi-user.target

app-web-1.target 的内容如下:

[Unit]
StopWhenUnneeded=true
Wants=app-web-1.service

最后,app-web-1.service:

[Unit]
StopWhenUnneeded=true

[Service]
User=deployer
WorkingDirectory=/home/deployer/app/releases/20141202043054
Environment=PORT=5000
ExecStart=/bin/bash -lc 'bundle exec puma -p 5000 '
Restart=always
StandardInput=null
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=%n
KillMode=process

显然,StopWhenUnneeded这是问题的一部分,但我不确定在我的应用程序内启动 Web 服务器时这应该做什么。

有人能帮我弄清楚如何让服务器运行并永久运行吗?

答案1

虽然 grawity 对找出问题所在有很大帮助,但我最终通过运行一个简单但被忽视的命令解决了问题:

sudo systemctl enable app.target

就是这样。只要启用目标,服务就会顺利运行。

CoreOS 文档帮我解决了这个问题。

答案2

就像手册页StopWhenUnneeded=true意思是“一旦没有其他活动单元不再依赖该单元,就停止该单元”。

例如,如果您启动app.target,它取决于app-web-1.target也将启动 ,同样取决于app-web-1.service

但如果你停止主单元app.target稍后运行,通常它根本不会影响其他两个单元——它们在“反向”方向上没有任何依赖关系,因此和都app-web-1.targetapp-web-1.service继续运行。

换句话说,最可能的意图是允许人们只使用 来停止所有服务systemctl stop app.target,而不必手动停止每个服务。它会起作用如果设置仅在“子”单元文件中(尽管它并不理想 - 在这种情况下 BindsTo= 更好)。

因此问题出StopWhenUnneeded=在主 app.target 单元中。由于您手动启动它,因此它从未任何其他单元都依赖于它,因此它将立即停止。

相关内容