我正在尝试使用 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.target
将app-web-1.service
继续运行。
换句话说,最可能的意图是允许人们只使用 来停止所有服务systemctl stop app.target
,而不必手动停止每个服务。它会起作用如果设置仅在“子”单元文件中(尽管它并不理想 - 在这种情况下 BindsTo= 更好)。
因此问题出StopWhenUnneeded=
在主 app.target 单元中。由于您手动启动它,因此它从未任何其他单元都依赖于它,因此它将立即停止。