python - 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
有谁知道为什么我的脚本服务没有启动?
解决方案
推荐阅读
- java - 为什么 JPA/Hibernate 设计了一种强制重新定义事务边界的方法,即使对于一个插入/更新数据库语句?
- google-apps-script - 结合 autoResizeRows 并将空行设置为大小为 1
- python - 传递一个列表或可变数量的参数作为方法参数
- c++11 - 如何确定 X 是否可以表示为任何 Y 不同正整数的总和?
- java - PowerMockito.mockStatic 给出 NoSuchMethodError 错误
- haskell - Haskell 中 MonadPlus 的默认类型评估是什么?
- 3d - 用颜色抽取 3D 网格
- ios - 提供原生 iOS 文档扫描仪?
- c# - C# Form1 不显示
- c - C整数和浮点除法输出