2015-03-31 7 views
0

Для проекта у меня есть простой скрипт python, который предлагает интерфейс http с флягой. Сам скрипт работает как шарм.запустить скрипт python как службу с daemontools

#!flask/bin/python 
from flask import Flask,request, Response 
import os.path 
import json 
import sys 
import logging 
import logging.handlers 
from dbMongoManager import saveToMongo 
from dbSQLManager import saveToMYSQL 
from FailedRequest import FailedRequest 
from JSONValidation import validateJSON 

app = Flask(__name__) 

#create logger 
logger = logging.getLogger('werkzeug') 
#defines logger file and max size 
handler = logging.handlers.RotatingFileHandler('request.log',maxBytes=5000000) 
#define logger format 
formatter = logging.Formatter("%(asctime)s;%(levelname)s;%(message)s") 
handler.setFormatter(formatter) 
#add loggerhandler to applications 
logger.addHandler(handler) 
app.logger.addHandler(handler) 

#invoked method on a POST request 
@app.route('/',methods = ['POST']) 
def add(): 
    """ 
    This function is mapped to the POST request of the REST interface 
    """ 
    print ("incoming POST") 
    #check if a JSON object is declared in the header 

    if request.headers['Content-Type'] == 'application/json; charset=UTF-8' and request.data: 
      print ("passed contentType check") 
      data = json.dumps(request.json) 
      #check if recieved JSON object is valid according to the scheme 
      #if (validateJSON(data)): 
      saveToMongo(data) 
      return "JSON Message saved in MongoDB" 

    raise FailedRequest 

#invoked method on a POST request 
@app.route('/sql',methods = ['POST']) 
def addSQL(): 
    """ 
    This function is mapped to the POST request of the REST interface 
    """ 
    print ("incoming SQL POST") 
    #check if a JSON object is declared in the header 

    if request.headers['Content-Type'] == 'application/json; charset=UTF-8': 
     print ("passed contentType check") 

     data = request.json 
     #check if recieved JSON object is valid according to the scheme 
     if (validateJSON(json.dumps(data))): 
      saveToMYSQL(data) 
      return "JSON Message saved in SQLDB" 

    raise FailedRequest 

if __name__ == "__main__": 
    print "Start App" 
    app.run(host="0.0.0.0",port=int("80"),debug=True) 

Поскольку это только простой сценарий, это не очень полезная, так как она не запускается в загрузке системы или аварии. Итак, следующая задача - создать службу на моем сервере debian, которая контролирует этот скрипт. Я очень новичок в деле debian для всего сервера, поэтому я считаю, что подход к файлам .conf немного запутан. В качестве простой альтернативы я нашел daemontools. Я установил его, и он работает. Я создал папку в/и т.д./услуг и поместил файл run.sh в нем со следующим содержанием:

#!/bin/sh 
echo Running service 
sudo python /home/admin/RestService.py 

svscan обнаруживает это и создает папку контролировать рядом с ним. Хотя вместо запуска restservice.py успешно, я получаю только контроль, а это значит, что что-то не так, я думаю.

Я пропустил что-то или что может быть проблемой здесь?

ответ

1

Зачем вам требуется sudo в run.sh? supervise работает как корень по умолчанию.

Попробуйте добавить регистрацию в свой run.sh. Изменить линию:

python /home/admin/RestService.py 2>&1 | logger -t RestService 

Затем проверьте /var/log/user.log для вывода.

Вы также можете использовать Multilog из DaemonTools: http://cr.yp.to/daemontools/multilog.html

+0

Спасибо! Это помогло мне выяснить, почему мой скрипт рушился! Хороший совет –

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