如何改进这个bash脚本?

时间:2018-05-09 13:36:24

标签: bash

我正在尝试编写一个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,我不确定这是否是正确的方法。

3 个答案:

答案 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等)来托管脚本。

了解更多: Shell Script For Process Monitoring

答案 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没有备注)