这是交易:我正在docker上运行一个freebsd web服务器和apache solr
每隔一段时间(每月几次)docker退出,我必须重新input以下内容:
service jetty start
我有点新创buildUnix脚本。 当然,我应该检查为什么服务停止,但为了快速修复,我不介意让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}是一个variables,所以我可以用“服务docker”replace它?
something gets thrown away :) if [something -equals 0] if something > 0 starting service fi fi
2>&1是什么意思?
或者从cron service jetty start运行service jetty start可能会更好? 因为如果它已经在运行,我得到已经运行的响应。
你有没有想过像monit这样的东西? 它会比cronjob响应得更快,邮件通知你,你可以指定一个运行状况检查,以确认应用程序工作正常。
从您的terminal尝试这种方式。 如果它正在工作,把它放在一个crontab中。
echo "PASSWORD" | sudo -S service jetty status && echo "Jetty is running" || sudo service jetty start
供参考:
|| 意味着逻辑OR , &&意味着逻辑AND
2>&1表示将STDERRredirect到STDOUT
几乎在每个程序中, 0是GOOD退出状态(大多数程序员正在以这种方式进行编程)。 所以如果service jetty status没有错误地退出,它只会回应Jetty is
runningJetty is
runningJetty is 。 其他方面,它将启动服务。
running
sudo -S – 从手册页: – “-S(stdin)选项会导致sudo从标准input读取密码,而不是terminal设备。密码后面必须换行符。
不要在crontab中创build一个服务,你可以添加一个小的守护进程来检查服务是否正在运行。 使用Suku的检查条件,你可以像这样编写一个小的守护进程:
#!/bin/sh reloader() { while : do sleep 5 service httpd jetty || sudo service jetty start done } reloader &
如果您的服务正在运行,该脚本将每5秒检查一次,并且不会消耗太多的CPU。 这比crontab中的作业更精确。
以root用户身份运行此脚本,而不是将脚本中的一些密码设置为明文,可能会更安全,效率也更低。
我会使用一个更全面的脚本来存储进程ID,并且更安全。
#!/bin/bash processId=$(service jetty start) # Start yetty processId=$! # stores the process ID of jetty while sleep 30 do if kill -0 $processId # Check if process is still running then echo >&2 "Process is running." else echo >&2 "ERROR - terminated" break fi done
将脚本偶尔放在一个cron和chech中。 请参阅更多示例和教程: http://mywiki.wooledge.org/BashFAQ#BashFAQ.2BAC8-042.How_can_I_find_out_if_a_process_is_still_running.3F
正如你在你的问题中所说,你需要调查停止服务的原因。
无论如何,你可以尝试monit 。 这是一个守护进程,可以configuration为监视您的服务,并在需要时重新启动。 所以,不需要为此写任何脚本。 此外,日志logging可帮助您了解服务何时停止并重新启动。
状态命令应该被所有的rc.d脚本支持。 您可以使用此脚本来重新启动死守护程序:
. /etc/rc.subr for service in ${autorestart_services}; do /usr/local/etc/rc.d/${service} status >/dev/null if [ $? != 0 ]; then echo "System service ${service} is down. Try to restart..." /usr/local/etc/rc.d/${service} restart fi done