Я пытаюсь запустить фоновую службу на моем Raspberry-Pi 3 для управления реле через команду http, и создал файл единицы обслуживания в / etc / systemd / system (gate_controller.service):
[Unit]
Description=Gate Controller
After=network.target
[Service]
Type=simple
User=2park
Group=root
WorkingDirectory=/home/pi/2park/Newest/gate_control/
ExecStart=/opt/pythonenv/gate_controller/bin/python2.7 server.py
Restart=on-abort
[Install]
WantedBy=multi-user.target
server.py следующим образом:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""
Tornado async server as simple REST API
"""
from __future__ import unicode_literals
import json
import tornado.ioloop
from tornado import gen
from tornado.options import options
from tornado.web import RequestHandler, Application
from tornado.httpserver import HTTPServer
from controller import Controller
from log import logger
gate_controller = Controller()
class GateAPIHandler(RequestHandler):
def prepare(self):
# Incorporate request JSON into arguments dictionary.
if self.request.body:
try:
json_data = json.loads(self.request.body)
self.request.arguments.update(json_data)
except ValueError:
message = 'Unable to parse JSON.'
self._return(status=400, message=message)
def _return(self, message=None, status=200):
"""
return error response and make sure the response is a json
"""
self.set_status(status)
if isinstance(message, dict):
self.write(message)
elif isinstance(message, basestring):
try:
json_msg = json.loads(message)
except:
self.write({'detail': message})
else:
self.write(json_msg)
elif message is None:
self.set_status(204)
else:
self.write({'detail': message})
self.flush()
def on_finish(self):
logger.info("Request ended")
@gen.coroutine
def post(self, *args, **kwargs):
args = self.request.arguments
action = args.get('action', None)
if action not in ('open', 'close'):
self._return(status=400, message="Invalid action")
else:
logger.info("Receive %s gate API call", action)
try:
if action == 'open':
yield gate_controller.open_then_close()
else:
yield gate_controller.close_gate()
except Exception as e:
self._return(status=500, message=e.message)
else:
self._return()
if __name__ == "__main__":
logger.info("Start the service")
tornado.options.parse_command_line()
app = Application(
[
(r'/', GateAPIHandler)
]
)
server = HTTPServer(app)
server.listen(8888)
tornado.ioloop.IOLoop.instance().start()
Однако, когда после запуска systemctl status gate_controller.service, я получаю следующее сообщение:
gate_controller.service - Gate Controller
Loaded: loaded (/etc/systemd/system/gate_controller.service; disabled)
Active: failed (Result: exit-code) since Mon 2019-01-07 15:47:40 HKT; 2s ago
Process: 2007 ExecStart=/opt/pythonenv/gate_controller/bin/python2.7 /home/pi/2park/Newest/gate_control/server.py (code=exited, status=1/FAILURE)
Main PID: 2007 (code=exited, status=1/FAILURE)
Я попробовал chmod a + wrx на gate_controller.service, остановил / запустил / перезапустил службу безрезультатно ... Кто-нибудь знает, что я делаю неправильно?