我一直在尝试让 systemd 服务运行一段时间,但一直没有成功。我想做的是创建一个启动脚本,用于启动经过修改的 Minecraft 服务器的 Java 程序。
这是名为 的 systemd 服务文件ftbstart.service
。它位于 中/etc/systemd/system/
,权限为 744(尽管我测试了各种不同的权限)。
[Unit]
Description=FTB Server
After=network.target
[Service]
Type=forking
User=root
Group=root
RemainAfterExit=yes
ExecStart=/usr/games/ftb/sstart.sh
ExecStop=/usr/games/ftb/sstop.sh
[Install]
WantedBy=multi-user.target
因此 ExecStart 启动另一个具有权限 755 的脚本,
sstart.sh
其中包含以下行:
#!/bin/bash
echo I made it to 1
mount -t tmpfs -o size=1024M tmpfs /usr/games/ftb/current/
echo I made it to 2
cp -r /usr/games/ftb/beyond/. /usr/games/ftb/current/
echo I made it to 3
/usr/bin/screen -S ftb -d -m /usr/games/ftb/current/ServerStart.sh
echo I made it to 4
echo 是为了调试目的。脚本会一直运行,如下所示
journalctl -u ftbstart
显示 1-4 的所有回声,但是 screen -list 之后不显示任何活动屏幕
systemctl restart ftbstart
/usr/games/ftb/sstart.sh
但是,如果我从命令行执行脚本,/bin/bash
它可以完美运行并且启动没有问题。
到目前为止我尝试过的事情:
- 添加到文件
#!/bin/bash
顶部ftbstart.service
- 移除
After=
- 更改/删除
Type=
(Type=simple
和Type=forking
) - 更改/删除
User=
和Group=
ftbstart.service
更改文件权限sstart.sh
- 放置
ExecStart=/bin/bash /usr/games/ftb/sstart.sh
我还确保输入:
systemctl daemon-reload
和
systemctl restart ftbstart
每次我测试ftbstart.service
文件中的某些内容等等,但似乎都没有任何效果。
我也尝试过只添加一行
ExecStart=/usr/bin/screen -S ftb -d -m /usr/games/ftb/current/ServerStart.sh
到 ftbstart.service 但它仍然不执行屏幕服务,但是
systemctl status ftbstart
只显示类似以下内容的内容:
Active: active (exited) since Thu 2017-09-07 20:56:35 UTC; 32min ago
但是,如果我将其替换ExecStart=
为ftbstart.service
以下内容:
ExecStart=screen -S top -d -m /usr/bin/top
然后它就神奇地工作了!它创建了一个可以附加的屏幕,并显示顶部命令行资源监视器。
所以,很抱歉问了这么长的问题,但有人能帮我找出我做错的地方吗?我猜是因为我正在启动另一个脚本而不是程序,所以有些地方出了问题,但我不确定。感谢您提供的任何帮助。
PS 如果有必要,这里是启动脚本sstart.sh
。我没有创建这个,它是 minecraft modpack 附带的脚本:https://pastebin.com/muCy0xnh