2014-02-11 72 views
2

我是Flask的新手,想要確保redis服務器正在運行,如果不是,請啓動它。下面是我有:如何在開始燒瓶之前檢查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:[錯誤2]沒有這樣的文件或目錄」

是否有檢查Redis的服務器運行的是更簡單的方法?

+1

,我不會採取這種方法。我會確保我的Flask應用程序和redis部署在一個容器/ rpm /無論。這不是你的Flask應用程序的工作來啓動redis。 – hughdbrown

+0

你能更具體嗎?我是燒瓶的新手 – user3287829

+1

這不是關於燒瓶的評論。這是對軟件環境中職責分離的評論。正如Hynek所說,「配置不是應用程序的一部分」。使用傀儡或廚師或者ansible或saltstack來部署您的應用程序及其所有依賴項。確保您的應用程序和依賴項使用supervisord或類似的方式運行。 – hughdbrown

回答

8

Useping CMD的Redis的:

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` 
+0

以及如何在沒有運行的情況下啓動它?另外,我應該把它放在before_first_request函數中嗎? – user3287829

+0

最好是手動啓動它,或者用'Puppet'類似的東西啓動它,而不是通過燒瓶應用程序啓動它,它的命令被添加到日誌輸出中。 –

+0

不要在'before_first_request'函數中使用這段代碼,把這段代碼放在你的燒瓶應用程序('app = Flask()')被定義的地方。 –

0

我會建議你使用某種supervisionsupervisordmonit他們的目的是檢查過程中,主機,文件等正在做它的工作,如果沒有,然後重新啓動它。

例如這裏是檢查的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 
相關問題