我有一台运行 CentOS 7 的远程服务器,我只能通过 SSH 访问。我希望两台 java 服务器始终在它们上面运行,即使在 ISP 确实重新启动等之后。S
因此,我尝试创建一个 systemd 服务,在屏幕中启动两个 java 服务器。启动服务时我没有收到任何错误消息,但它立即死亡:(systemctl status -l blogpatcher.service)
* blogpatcher.service - Start blogpatcher servers
Loaded: loaded (/etc/systemd/system/blogpatcher.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Sat 2020-02-08 04:19:09 EST; 7s ago
Process: 22388 ExecStart=/usr/bin/bash /home/blogpatc/script/blogpatcher.sh (code=exited, status=0/SUCCESS)
Main PID: 22388 (code=exited, status=0/SUCCESS)
这是 blogpatcher.service 文件:
# vi /etc/systemd/system/blogpatcher.service
[Unit]
Description=Start blogpatcher servers
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/bash /home/blogpatc/script/blogpatcher.sh
TimeoutStartSec=90
[Install]
WantedBy=default.target
这是服务运行的脚本文件:
# vi /var/tmp/test_script.sh
#!/bin/bash
screen -dmS syn bash -c 'cd /home/blogpatc/server/;java -cp bloghelper_artifact_main.jar com.aperico.bloghelper.server.ThesaurusServer;exec bash'
如果我只是从 SSH 控制台运行脚本文件,它会按预期工作,并且由于没有错误消息,我有点难过,想知道是否有人知道问题出在哪里?
添加:[Service] 部分下的“RemainAfterExit=yes”将使屏幕保持打开状态。
问题可能
exec bash
在最后。bash
没有输入,因此退出。如果您对任何 shell 执行 exec,则效果相同:没有输入,因此 shell 退出。但更根本的是:为什么使用
screen
? 这里有什么优势?让 systemd 重新启动有什么问题?
和
Systemd 有很多额外的参数和可能性你可能想阅读它们。例如,如果脚本仅用于设置工作目录(而不是像我假设的那样作为更详细的启动脚本的开始),您可能需要查看
WorkingDirectory
JdeBP 在评论中建议的那样。如果你坚持
screen
必须在启动脚本中使用,那么你的单元文件的服务部分应该是这样的:或探索
Type=forking
而不是Type=simple
.