我正在尝试使用 monit 检查我的游戏服务器,如果失败则重新启动它。monit 部分相当简单,可以检查端口 28960,但如果 monit 检测到失败,我很难运行启动脚本 (cod4.sh)。
到目前为止我有:monitrc:
set daemon 60
# set log /var/log/monit.log
set mailserver 127.0.0.1
# set mail-format { from: monit@mydomain }
set alert [email protected]
set httpd port 2812
allow alec:password
check host dels with address 127.0.0.1
start program = "/bin/systemctl start cod4"
stop program = "/bin/systemctl stop cod4"
if failed port 28960 then restart`
这有效,如果我关闭服务器,我就会收到一封电子邮件。
我创建了一个服务文件 cod4.service
[Unit]
Description=Cod4 service
[Service]
User=cod4
Type=forking
ExecStart=/cod4-linux-server/cod4.sh
[Install]
WantedBy=multi-user.target
cod4.sh 由以下部分组成:
#!/bin/bash
screen -dmS cod4 ./cod4x18_dedrun +set r_xassetnum "xmodel=1200" +set sv_authorizemode "0" + set sv_maxclients "64" +set fs_game "mods/rotu2beta" +exec server.cfg +map_rotate
当我尝试启动服务器但service cod4 start
什么也没有发生时,我可能是以错误的方式进行了处理,或者像往常一样通过拼凑来自不同站点的代码而使其变得过于复杂。
基本上,monit 会检查端口 28960,如果出现故障,则需要运行 cod4.sh。
请问有什么想法吗?
我认为有一点进步,
systemctl daemon-reload
systemctl enable cod4.service
我现在明白了
systemctl status cod4
● cod4.service - Cod4 service
Loaded: loaded (/lib/systemd/system/cod4.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Mon 2019-11-11 16:01:22 EST; 52s ago
Process: 17788 ExecStart=/cod4-linux-server/cod4.sh (code=exited, status=0/SUCCESS)
Main PID: 17790 (code=exited, status=0/SUCCESS)
这表明它确实执行了 cod4.sh,然后按应有的方式退出,但是lsof -i
用户 cod4 告诉我服务器没有运行。
那么su cod4 cd/cod4-linux-server ./cod4.sh
正确加载服务器和
[Service]
User=cod4
Type=forking
ExecStart=/cod4-linux-server/cod4.sh
[Install]
WantedBy=multi-user.target
答案1
谢谢你,Kamil,你的第一条评论很正确,让我意识到了 Ubuntu 的另一个奇怪之处,让我来解释一下这里发生了什么。
Monit 运行正常,cod4.service 文件正确,并且确实在被询问时运行。
当服务运行时,它会查找 cod4.sh 脚本/cod4-linux-server/
,发现没有问题,但./cod4x18_dedrun
由于某种原因,它在脚本内部找不到它。将其更改为 即可/cod4-linux-server/cod4x18_dedrun
。
因此,如果您从 systemd 运行脚本,并且该脚本与其启动的二进制文件位于同一文件夹中,则您仍然需要绝对了解二进制路径!
干杯