我写了一个bashscript,内容如下:
#!/bin/bash
cd /opt/ut_server/System
./ucc-bin-linux-amd64 server DM-Rankin?game=XGame.xDeathMatch?mutator=AntiTCC2009r6.MutAntiTCCFinal,utcompv17a.MutUTComp?AdminName=admin?AdminPassword=1111 ini=server.ini -port=1234 -log=s9.log -nohomedir &
sleep 10
echo "finish ucc"
exit 0
现在我想用一个单元文件和systemd启动它:
[Unit]
Description=Unreal Tournament 2004 Server
After=network.target
[Service]
WorkingDirectory=/home/unreal-user/
User=unreal-user
Group=unreal-user
Type=forking
ExecStart=/home/unreal-user/start_ut_serv.sh &
ExecStartPost=/bin/bash -c "umask 022; echo $MAINPID > /home/unreal-user/ut2k4-server.pid"
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -9 $MAINPID
TimeoutSec=400
ExecRestart=/bin/kill -9 $MAINPID && /home/unreal-user/start_ut_serv.sh
PIDFile=/home/unreal-user/ut2k4-server.pid
RestartSec=30
Restart=on-failure
#Restart=always
[Install]
WantedBy=multi-user.target
当我启动服务文件时,出现如下错误:
ut2k4-serv.service: Start operation timed out. Terminating.
systemd[1]: ut2k4-serv.service: Control process exited, code=killed, status=15/TERM
为什么这个时间在这里?如何处理这个问题?
当我启动 bashscript 手册时,即使在其中指定了作业,它似乎仍然在 STDOUT 上有一些东西?这只是好奇..
这主要是从systemd.service 文档中复制粘贴,因为它在很大程度上已经足够了。
你的进程显然不是一个分叉进程,当它被 systemd 原生支持时,你已经尝试了多次黑客攻击以使其成为一个。
您正在将 systemd
MAINPID
变量写入该文件,但不仅MAINPID
没有记录,ExecStartPost=
而且更重要的是,由于PIDFile
已设置,它实际上是从该文件中读取的(此时,我不太确定它扩展为什么,因为在这个情况,这没有任何意义;它应该在ExecStart=
返回时被读取,所以我会说它是空的)。除了对. _
ExecStart=
_ExecRestart=
Type=
ExecRestart=
到目前为止,您的 bash 包装器是无用的,根据它的目的,您应该完全删除它并直接将 UT 服务器设置为
ExecStart=
参数。服务器命令行可以来自一个EnvironmentFile=
,你就完成了!此外,除非该服务器绝对是一场噩梦,否则使用 SIGKILL 停止任何类型的服务都是……糟糕,至少可以这么说。的默认实现
ExecStop=
可能更适合。下次编写服务脚本时,尝试从默认的开始,逐步更改参数,而不是更改所有参数,然后想知道二十个参数中的哪一个坏了,调试起来更容易?