【问题标题】:How do I check if redis is running before I start flask (and start it if it isn't)?如何在启动烧瓶之前检查 redis 是否正在运行(如果没有则启动它)?
【发布时间】:2014-02-11 16:57:37
【问题描述】:

我是 Flask 的新手,想确保 redis 服务器正在运行,如果没有,则启动它。这是我所拥有的:

@app.before_first_request
def initialize():
  cmd = 'src/redis-cli ping'
  p = subprocess.Popen(cmd,stdout=subprocess.PIPE)
  out, err = p.communicate()
  #if out.startswith('Could not connect to Redis'): #start redis here
  if err is not None: raise Exception(err)

但是,我收到错误“OSError: [Errno 2] No such file or directory”

有没有更简单的方法来检查redis服务器是否正在运行?

【问题讨论】:

  • 我不会采用这种方法。我会确保我的 Flask 应用程序和 redis 部署在单个容器/rpm/whatever 中。启动 redis 不是您的 Flask 应用程序的工作。
  • 你能说得更具体些吗?我是烧瓶新手
  • 这不是关于 Flask 的评论。这是对软件环境中职责分离的评论。正如 Hynek 所说,“配置不是应用程序的一部分”。使用 puppet 或 chef 或 ansible 或 saltstack 来部署您的应用程序及其所有依赖项。确保您的应用程序和依赖项使用 supervisord 或类似工具运行。
  • 并且:通过在仅由脚本填充的虚拟环境中运行应用程序,确保您了解所有依赖项。

标签: python redis flask


【解决方案1】:

Usepingredis的cmd:

import redis
from redis import ConnectionError
import logging

logging.basicConfig()
logger = logging.getLogger('redis')

rs = redis.Redis("localhost")
try:
    rs.ping()
except ConnectionError:
    logger.error("Redis isn't running. try `/etc/init.d/redis-server restart`")
    exit(0)

样本输出:

ERROR:redis:Redis isn't running. try `/etc/init.d/redis-server restart`

【讨论】:

  • 如果它没有运行,我该如何启动它?另外,我应该把它放在 before_first_request 函数中吗?
  • 最好手动启动它或通过类似于Puppet 的方式启动它,而不是通过烧瓶应用程序启动它,它的命令添加到日志的输出中。
  • 不要在before_first_request函数中使用这段代码,把这段代码放在你定义的flask应用程序(app = Flask())的某个地方。
【解决方案2】:

我建议您使用某种supervision,例如supervisordmonit,它们旨在检查进程、主机、文件等是否正在执行;如果没有,则重新启动它。

例如这里是检查redis的配置:

 check host redis with address <your_redis_host>
  if failed icmp type echo count 3 with timeout 3 seconds then alert
  if failed port 6379 with timeout 15 seconds then alert

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2018-04-25
    • 1970-01-01
    • 2016-05-06
    • 2018-05-11
    • 1970-01-01
    • 2019-11-16
    相关资源
    最近更新 更多