【发布时间】:2018-05-09 13:36:23
【问题描述】:
我正在尝试编写一个 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,我不确定这是否是正确的方法。
【问题讨论】:
-
试图避免这种被封闭为固执己见,“你会怎么做”和“这是正确的方式”是边缘固执己见,因为我们都会以不同的方式做这件事。最好帮助您编写代码和样式。那么你的代码有效吗?它具体没有做什么你想要的?
-
我强烈建议您将其写为:
if ! ps ....; then ...; fi。不要明确检查$?;几乎从不需要,如果您直接检查命令状态,脚本会更干净。 -
第二个建议是;不要这样做。与其从 cron 生成一个(非常脆弱的)检查您的服务器是否正在运行的作业,不如在 systemd 或 supervisord 的监督下运行服务器。
-
$?是一个整数,应该在[ … ]中这样对待,这意味着你应该使用[ $? -ne 0 ]。请参阅man test,因为[实际上只是名为test的程序的别名。 -
您的 echo-log 命令定义了 2 个输出重定向,这是一个错误:第一个是
>> …/RestartLog.txt,第二个是> /dev/null。因为一个程序只有一个标准输出,所以只有一个重定向可以生效。 shell 实际上会轮流应用这两个,但只有最后一个获胜,所以日志消息被发送到/dev/null。您可能希望第二个输出重定向将标准错误重定向到/dev/null,这将被写为2> /dev/null,但这实际上是没有用的,因为echo永远不会在标准错误上产生任何输出(除非魔法)。
标签: bash