2015-02-08 2 views
0

У меня есть скрипт python на сервере Amazon EC2, который запрашивает данные с двух разных серверов (используя urllib и http.request), эти данные затем записываются в текстовый файл. Он должен работать в течение длительного времени. Я использую nohup, чтобы запустить его на заднем плане.скрипт python останавливается через некоторое время

Дело в том, что оно останавливается через некоторое время (иногда оно длится 24 часа, иногда 2 часа, оно меняется). Я не получаю сообщение об ошибке или что-то еще. Он просто останавливается, и последняя строка полученных символов сохраняется в текстовом файле как неполная строка (только информация, которая может считываться с удаленного сервера).

Что может вызвать эту проблему?

Это код, у меня есть:

import urllib3 # sudo pip install urllib3 --upgrade 
import time 

urllib3.disable_warnings() # Disable urllib3 warnings about unverified connections 
http = urllib3.PoolManager() 

f = open('okcoin.txt', 'w') 
f2 = open('bitvc.txt', 'w') 

while True: 
    try: 
     r = http.request("GET","https://www.okcoin.com/api/v1/future_ticker.do?symbol=btc_usd&contract_type=this_week") 
     r2 = http.request("GET","http://market.bitvc.com/futures/ticker_btc_week.js ") 
    except: # catch all exceptions 
     continue 

    #Status codes of 200 if it got an OK from the server 
    if r.status != 200 or r2.status != 200 or r.data.count(',') < 5 or r2.data.count(',') < 5: # avoids blank data, there should be at least 5 commas so that it's correct data 
     continue; # Try to read again if there was a problem with one reading 

    received = str(time.time()) # Timestamp of when the information was received to the server running this python code 

    data = r.data + "," + received + "\r\n" 
    data2 = r2.data + "," + received + "\r\n"   

    print data,r.status 
    print data2, r.status 

    f.write(data) 
    f2.write(data2) 

    time.sleep(0.5) 
    f.flush() #flush files 
    f2.flush() 
f.close() 
f2.close() 

EDIT: я оставил программу открыть с помощью экрана через SSH. Он снова остановился. Если я нажму «CTRL + C», чтобы остановить его, это то, что я получаю:

^CTraceback (most recent call last): 
    File "tickersave.py", line 72, in <module> 
    r2 = http.request("GET","http://market.bitvc.com/futures/ticker_btc_week.js") 
    File "/usr/local/lib/python2.7/dist-packages/urllib3/request.py", line 68, in request 
    **urlopen_kw) 
    File "/usr/local/lib/python2.7/dist-packages/urllib3/request.py", line 81, in request_encode_url 
    return self.urlopen(method, url, **urlopen_kw) 
    File "/usr/local/lib/python2.7/dist-packages/urllib3/poolmanager.py", line 153, in urlopen 
    response = conn.urlopen(method, u.request_uri, **kw) 
    File "/usr/local/lib/python2.7/dist-packages/urllib3/connectionpool.py", line 541, in urlopen 
    **response_kw) 
    File "/usr/local/lib/python2.7/dist-packages/urllib3/response.py", line 284, in from_httplib 
    **response_kw) 
    File "/usr/local/lib/python2.7/dist-packages/urllib3/response.py", line 104, in __init__ 
    self._body = self.read(decode_content=decode_content) 
    File "/usr/local/lib/python2.7/dist-packages/urllib3/response.py", line 182, in read 
    data = self._fp.read() 
    File "/usr/lib/python2.7/httplib.py", line 551, in read 
    s = self._safe_read(self.length) 
    File "/usr/lib/python2.7/httplib.py", line 658, in _safe_read 
    chunk = self.fp.read(min(amt, MAXAMOUNT)) 
    File "/usr/lib/python2.7/socket.py", line 380, in read 
    data = self._sock.recv(left) 

Любые подсказки? Должен ли я добавлять тайм-ауты или что-то еще?

ответ

0

Соберите все результаты своей программы, и вы найдете очень хороший намек на то, что не так. То есть определенно соберите stdout и stderr. Для того чтобы это произошло, вы можете назвать свою программу так:

$ nohup python script.py > log.outerr 2>&1 & 

, который собирает как, стандартный вывод и стандартный поток ошибок в файл log.outerr, и запускает программу развязки с терминала и в фоновом режиме. Изучение log.outerr после того, как ваша программа перестала работать, вероятно, будет довольно показательной, я думаю.

+0

Это случилось снова. Он остановился. Но файл log.outerr не имеет никакой ошибки или чего-либо еще! Только выход есть (информация запрашивается с сервера). Последние строки просто неполны, но нет ошибки или чего-то еще! У вас есть ключ к тому, что происходит? –

+0

Внешнее событие неожиданно убивает ваш сценарий тяжелыми средствами, так что у него нет возможности сообщить что-либо в stdout/err. Таковым событием будет SIGKILL, где процесс получения не имеет никакого шанса ответить. То есть вам нужно увеличить свой юниверс отладки и не только посмотреть на сам сценарий, но и на всю среду, в которой он запущен. –

+0

Я вижу ... Как вы думаете, это имеет какое-то отношение к серверу Amazon EC2? Я в основном запускал код одновременно на своем компьютере и на удаленном сервере. Скрипт на моем компьютере все еще запущен, однако Amazon остановился ... Есть ли что-нибудь в сервере Linux, которое может вызвать это? Спасибо! –

Смежные вопросы