情况是这样的:我在码头上运行一个带有 apache solr 的 freebsd 网络服务器
有时(每月几次)码头就会退出,我必须通过输入以下命令来重新启动它:
service jetty start
我对创建 unix 脚本还不太熟悉。当然我应该检查服务停止的原因,但为了快速解决问题,我不介意每半小时运行一次 cron 来检查服务是否仍在运行。
我发现这个网站但我不完全了解它在做什么,所以我无法根据我的需要进行修改。
# check rc script supports status
${SERVICE} 2>&1 | /usr/bin/grep '|status|poll' >/dev/null
if [ $? -eq 0 ]
then
# check status
STATUS=$(${SERVICE} status)
if [ $? -gt 0 ]
then
# service not running try to start
echo ${STATUS}
${SERVICE} start
${SERVICE} status
fi
fi
因此,我可以从上面的代码中得出以下结论:
{SERVICE} 是一个变量,所以我可以用“service jetty”替换它吗?
something gets thrown away :)
if [something -equals 0]
if something > 0
starting service
fi
fi
是什么2>&1
意思/做什么?
或者也许直接service jetty start
从 cron 运行更好?因为如果它已经在运行,我会得到它已经在运行的响应。
答案1
您是否考虑过 monit 之类的东西?它的响应速度比 cronjob 快得多,会向您发送通知邮件,并且您可以指定健康检查以确认应用程序正常运行。
答案2
您无需在 crontab 中创建服务,而是可以添加一个小守护进程来检查服务是否正在运行,并在服务未运行时重新加载。使用 Suku 的检查条件,您可以编写如下小守护进程脚本:
#!/bin/sh
reloader() {
while :
do
sleep 5
service httpd jetty || sudo service jetty start
done
}
reloader &
此脚本每 5 秒会检查一次您的服务是否正在运行,并且不会消耗太多 CPU。这比 crontab 中的作业更精确。
以 root 身份运行此脚本而不是在脚本本身上以明文形式输入密码可能更安全并且效率更低。
答案3
从您的终端尝试此方法。如果它有效,请将其放入 crontab 中。
echo "PASSWORD" | sudo -S service jetty status && echo "Jetty is running" || sudo service jetty start
供参考 :
||
意味着合乎逻辑OR
,&&
意味着合乎逻辑AND
2>&1
意味着重定向STDERR
到STDOUT
0
是GOOD
几乎每个程序的退出状态(大多数程序员都是这样编程的)。因此,如果service jetty status
退出时没有错误,它只会回显。否则它将启动服务。Jetty is
runningsudo -S
- 来自手册页:- “-S(stdin)选项导致 sudo 从标准输入而不是终端设备读取密码。密码后面必须跟一个换行符。”
答案4
正如您在问题中所说,您需要调查停止服务的原因。
无论如何你可以尝试监控。它是一个守护进程,可以配置为监视您的服务并在需要时重新启动。因此,无需为此编写任何脚本。此外,日志记录可以帮助您了解服务何时停止和重新启动。