2013-05-04 54 views
9

我正在嘗試使用芹菜來安排和運行一組服務器上的任務。每個任務都有些長時間運行(幾個小時),並且涉及使用子進程來調用具有給定輸入的特定程序。這個程序在stdout和stderr中都會產生很多輸出。芹菜流結果

是否有某種方法可以近乎實時地向客戶端顯示程序產生的輸出?流輸出,以便客戶端可以觀看服務器上運行的任務所輸出的輸出而不登錄到服務器?

+0

當另一個程序運行時,你的芹菜任務在做什麼?你只是使用'subprocess.call'? – 2013-05-12 12:48:08

+0

是一個subprocess.call。 – 2013-05-14 03:34:37

回答

11

您沒有指定許多要求和約束。我假設你已經有一個redis實例。

什麼,你可以閱讀從線路上的其他工藝生產線的輸出,並通過Redis的發佈:

這裏有一個例子,你可以echo數據寫入文件/tmp/foo來進行測試:

import redis 
redis_instance = redis.Redis() 
p = subprocess.Popen(shlex.split("tail -f /tmp/foo"), stdout=subprocess.PIPE) 

while True: 
    line = p.stdout.readline() 
    if line: 
     redis_instance.publish('process log', line) 
    else: 
     break 

在一個單獨的過程中:

import redis 

redis_instance = redis.Redis() 
pubsub = redis_instance.pubsub() 
pubsub.subscribe('process log') 

while True: 
    for message in pubsub.listen(): 
     print message # or use websockets to comunicate with a browser 

如果你想過程結束,你可以例如芹菜任務完成後發送「退出」。

您可以使用不同的通道(subscribe中的字符串)將輸出與不同進程分開。

您還可以將日誌輸出存儲在Redis的,如果你想,

redis_instance.rpush('process log', message) 

,後來在全面檢索。

5

的一個方式,我看到如何做到這一點是寫一個將用於標準錯誤和標準輸出定製記錄器(見docs

​​

你的記錄器可以將數據保存到數據庫中,Memcached的, Redis的或任何共享存儲,你會用它來獲取數據

我不知道有關logger的結構,但我想這樣的事情會工作。

from logging import Logger 

class MyLogger(Logger): 
    def log(lvl, msg): 
     # Do something with the message 
+0

@anand_trex你嘗試過嗎? – AJP 2013-05-08 14:16:33

+0

我不太喜歡混合日誌記錄和結果流。由於這是一種破解,我不會使用這個解決方案。 – 2013-05-14 03:35:28

2

這是一個老問題,但它仍然是關於這個特定主題的唯一結果。

以下是我去一下吧, 我創建了Redis的

class RedisFileObject(object): 
    def __init__(self, _key): 
     self.connection = redis.Redis() 
     self.key = _key 
     self.connection.publish('debug', 'Created channel %s' % self.key) 

    def write(self, data): 
     self.connection.publish(self.key, data) 

    def close(self): 
     pass 

我有一個BaseTask從我所有的任務繼承了各種功能,含發佈到特定頻道的簡單文件的對象。這個用Redis文件類對象替換stdout和stderr。

def capture_output(self): 
    sys.stdout = RedisFileObject(self.request.id) 
    sys.stderr = RedisFileObject(self.request.id) 

從那裏寫到標準輸出/標準錯誤很少會被轉發到任務ID命名的Redis的通道。