我正在尝试编写一个bash脚本。 该脚本应检查MC服务器是否正在运行。如果它崩溃或停止,它将自动启动服务器。
我将每分钟使用crontab运行脚本。我想我可以每秒运行一次,它不会给CPU带来太多压力。我也想知道服务器什么时候重启。所以我打算将日期打印到“RestartLog”文件。
这是我到目前为止所做的:
#!/bin/sh
ps auxw | grep start.sh | grep -v grep > /dev/null
if [ $? != 0 ]
then
cd /home/minecraft/minecraft/ && ./start.sh && echo "Server restarted on: $(date)" >> /home/minecraft/minecraft/RestartLog.txt > /dev/null
fi
我刚刚开始学习Bash,我不确定这是否是正确的方法。
答案 0 :(得分:0)
您可以使用monit
执行此任务。 See docu。它在大多数Linux发行版上都可用,并且具有简单的配置。找一些examples in this post
对于您的应用,它看起来像
check process minecraftserver
matching "start.sh"
start program = "/home/minecraft/minecraft/start.sh"
stop program = "/home/minecraft/minecraft/stop.sh"
我写了这个答案,因为有时最有效的解决方案已经存在,你不需要编写任何代码。另请遵循William Pursell的建议,并使用操作系统的init系统(systemd,upstart,system-v等)来托管脚本。
答案 1 :(得分:0)
如果start.sh
阻塞直到服务器存在/崩溃,那么最好只需在无限循环中重新启动它而不涉及cron
。只需键入一个控制台(或放入另一个脚本):
#!/bin/bash
cd /home/minecraft/minecraft/
while sleep 3; do
echo "$(date) server (re)start" >> restart.log
./start.sh # blocks until server crashes
done
但如果它没有阻止(即如果start.sh
启动服务器然后返回,但服务器继续运行),则需要执行不同的检查以验证服务器是否确实仍然存在正在运行,而不是ps|grep start.sh
PS:要杀死无限循环,您必须Ctrl+C
两次:一次停止./start.sh
,一次退出直接sleep
。
答案 2 :(得分:0)
使用cron是可能的,还有其他(更好的)解决方案(monit,supervisord等)。但这不是问题;你要求"正确的方式"。正确的方法很难定义,但了解代码中的限制和问题可能对您有所帮助。
使用普通cron
执行最多每分钟执行一次。这意味着你的Minecraft服务器可能会在重启之前的59秒内停机。
#!/bin/sh
你应该在行的开头有#!
。不知道这是否是剪切/粘贴问题,但它非常重要。此外,您可能希望使用#!/bin/bash
代替#!/bin/sh
来实际使用bash。
ps auxw | grep start.sh | grep -v grep > /dev/null
有些人可能会建议使用ps -ef
,但这是一个品味问题。您甚至可以使用ps -ef | grep [s]tart.sh
来防止使用第二个grep。然而,这一行的主要问题是您正在解析相当通用的start.sh
的进程列表。如果你有一个专门的服务器,这可能没问题,但是如果服务器上有更多的用户,你就冒着别人为完全不同的东西运行start.sh
的风险。
if [ $? != 0 ]
then
关于$?
和清洁代码的使用已有评论。
cd /home/minecraft/minecraft/ && ./start.sh && echo "Server restarted on: $(date)" >> /home/minecraft/minecraft/RestartLog.txt > /dev/null
保留重启的日志是个好主意。在这一行中,您使./start.sh
的执行依赖于cd
成功的事实。此外,只有 ./start.sh
存在后,才会执行回显。
所以这给我留下了一个问题:只要服务器运行,start.sh
是否继续运行(在这种情况下:ps
- 测试没问题,但是&& echo
使得毫无意义,或者start.sh
退出,同时将Minecraft服务器留在后台(在这种情况下,ps
- grep
无法正常工作,但回音是有意义的仅当start.sh
正确退出时的日志记录。
fi
(fi
没有备注)