使用daemontools作为服务运行python脚本

2024-04-16 21:02:24 发布

您现在位置:Python中文网/ 问答频道 /正文

对于一个项目,我有一个简单的python脚本,它提供了一个与flask的http接口。剧本本身就像一个符咒。在

#!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。 我确实安装了它,并且运行了。我在/etc/services中创建了一个子文件夹,并将运行.sh包含以下内容的文件:

^{pr2}$

svscan检测到它并在它旁边创建一个监督文件夹。 虽然没有启动restservice.py成功的话,我只得到了一个主管,这意味着我想一定是出了什么问题。在

我是不是漏掉了什么东西或者可能是这里的问题?在


Tags: thetofromimportjsonappdataif
1条回答
网友
1楼 · 发布于 2024-04-16 21:02:24

你为什么要求sudo进来run.sh?默认情况下,supervisor作为根目录工作。在

尝试在您的运行.sh。将行改为:

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

然后检查/var/log/用户日志用于输出。在

您可能还希望使用daemontools中的multilog:http://cr.yp.to/daemontools/multilog.html

相关问题 更多 >