首页 > 解决方案 > Systemd 服务未运行 Python 脚本

问题描述

所以我按照这个网站上的教程(https://medium.com/codex/setup-a-python-script-as-a-service-through-systemctl-systemd-f0cc55a42267)并且示例服务启动得很好。但是,当我用我想要运行的脚本替换脚本时,服务没有启动,而是给出了以下错误。

● test.service - My test service
   Loaded: loaded (/etc/systemd/system/test.service; enabled; vendor preset: ena
   Active: failed (Result: exit-code) since Mon 2021-08-09 15:31:35 PKT; 1s ago
  Process: 13683 ExecStart=/usr/bin/python3 /home/jetsonuser/test.py (code=exite
 Main PID: 13683 (code=exited, status=1/FAILURE)

اگست 09 15:31:35 jetsonuser systemd[1]: test.service: Service hold-off time over
اگست 09 15:31:35 jetsonuser systemd[1]: test.service: Scheduled restart job, res
اگست 09 15:31:35 jetsonuser systemd[1]: Stopped My test service.
اگست 09 15:31:35 jetsonuser systemd[1]: test.service: Start request repeated too
اگست 09 15:31:35 jetsonuser systemd[1]: test.service: Failed with result 'exit-c
اگست 09 15:31:35 jetsonuser systemd[1]: Failed to start My test service.

这是 python 脚本,它自己运行良好,但不是作为“systemd”服务。

from flask import render_template, request, Blueprint, redirect, url_for
from multiprocessing import Process
import multiprocessing
import os
from SpeedWorker1_xtest import SpeedWorker
import logging
import time
from platform import system

import serial
from serial.serialutil import SerialException
import json
import time
import pandas as pd
import numpy as np
BASE = "http://203.135.63.90:80/"     # remote host
import requests
import itertools

from datetime import datetime
from dateutil.parser import parse
global speed_buffer

import socket
BASE_HOST = '203.135.63.90'
BASE_PORT = 80

class SpeedObject:
    def __init__(self, speed, speed_range, speed_time):
        self.speed = speed
        self.speed_range = speed_range
        self.speed_time = speed_time

class SpeedWorker:
    def __init__(self,port,baud_rate,logger,speed_buffer,flag):
        self.baud_rate = baud_rate
        self.port=port
        self.logger=logger
        self.stopflag=True
        self.speed_buffer = speed_buffer
        self.flag = flag
        self.test=1
        self.serial_port=serial.Serial(self.port,baudrate=int(self.baud_rate))
        flag = self.flag
        speed_buffer = self.speed_buffer
       
    def process_speed(self):
        range_value=np.zeros(20,dtype=float)
        speed_value=np.zeros(20,dtype=float)
        time_value=np.zeros(20,dtype=datetime)
        rangeind=0
        speedind=0
        rangecount=0
        speedevent=False
        event_inc = 1       # temporary setup
        self.serial_port.reset_input_buffer()
        self.serial_port.flushInput()
        self.serial_port.flushOutput()
        self.logger.info("Worker started Working")
        while self.stopflag:
            try:
                if self.serial_port.isOpen():
                    try:
                        x=self.serial_port.readline().decode('utf8','strict')
                    except UnicodeDecodeError:
                        self.logger.exception("Serial Decoding Error")
                    try:
                        ndata=json.loads(x)
                        if 'range' in ndata.keys():
                            rangecount+=1
                            xnew=self.serial_port.readline().decode('utf8','strict')
                            ndatanew=json.loads(xnew)
                            if 'speed' in ndatanew.keys():
                                if rangeind==range_value.shape[0]:
                                    rangeind=0
                                    range_value[0:20]=0
                                    speed_value[0:20]=0
                                range_value[rangeind]=float(ndata['range'])
                                speed_value[rangeind]=float(ndatanew['speed'])
                                time_value[rangeind]=datetime.now()
                                speedevent=True
                                rangeind+=1
                                rangecount-=1
                        if rangecount==10:
                            rangecount=0
                            if speedevent:
                                sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                                result = sock.connect_ex((BASE_HOST, BASE_PORT))
                                if result == 0:
                                    for (a, b, c) in zip(speed_value, range_value, time_value):
                                        if a and b and c and a != 0 and b != 0 and c != 0:
                                            res2 = requests.post(BASE + 'reading/', json = {"speed": str(a), "speed_range": str(b), "speed_time": str(c), "owner_id": str(event_inc)})
                                            if res2.ok:
                                                print('Reading added to Reading, linked to Event', str(event_inc))
                                else:
                                    print('Port ', BASE_HOST, ' not open!')
                                event_inc += 1      # temporary setup
                                speedevent = False
                                range_value=np.zeros(20,dtype=float)
                                speed_value=np.zeros(20,dtype=float)
                                time_value=np.zeros(20,dtype=datetime)
                    except json.decoder.JSONDecodeError:
                        self.logger.exception("Error while decoding JSON string in worker")
            except SerialException:
                self.logger.exception("Serial Exception in worker speed process")

    def stopworker(self,process):
        process.terminate()
        process.join()
        print("test called in worker stop",self.test+1)
        print("Process p2 is alive: {}".format(process.is_alive()))
        self.stopflag=False
        #serial.Serial(self.port,baudrate=int(self.baud_rate)).close()
        self.serial_port.close()
        print("speed_false")

start = 0
flag = 0
speed_buffer = []

logger = logging.getLogger('Speedworker')
hdlr = logging.FileHandler('speedworker.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.DEBUG)

if system() == "Linux":
    port = "/dev/ttyUSB0"
    port2 = "/dev/ttyUSB1"

else:
    port = "COM4"

global speedworker
global speedworker2

speedworker = SpeedWorker(port, 19200, logger, speed_buffer, flag)
# ~ speedworker2 = SpeedWorker(port2, 19200, logger, speed_buffer, flag)

print("ID of main process: {}".format(os.getpid()))

global p2
global p3

p2 = multiprocessing.Process(target=speedworker.process_speed)
# ~ p3 = multiprocessing.Process(target=speedworker2.process_speed)

p2.start()
# ~ p3.start()

print("ID of process p2: {}".format(p2.pid))
# ~ print("ID of process p3: {}".format(p3.pid))

print("Process p2 is alive: {}".format(p2.is_alive()))
# ~ print("Process p3 is alive: {}".format(p3.is_alive()))

这是“.service”文件代码。

[Unit]
Description=My test service
After=multi-user.target
RestartSec=

[Service]
Type=simple
Restart=always
ExecStart=/usr/bin/python3 /home/jetsonuser/test.py

[Install]
WantedBy=multi-user.target

有谁知道为什么我的脚本服务没有启动?

标签: pythonpython-3.xpython-multiprocessingubuntu-18.04systemd

解决方案


推荐阅读