[英]Linux / Raspberry Pi OS - Systemd not working with python3 script using OS module that accesses enviroment variable
[英]Trying to launch a python script with systemd but it doesnt work on Raspberry Pi
它在 Mu 中正常運行,但是當我嘗試使用 systemd 運行它時(在打開 RPI 時運行)它不起作用。
這是來自終端的錯誤
● skateboard.service - skateboard
Loaded: loaded (/etc/systemd/system/skateboard.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Tue 2021-03-30 21:38:19 EDT; 14s ago
Process: 467 ExecStart=/usr/bin/python3 /home/pi/Desktop/PythonScripts/skateboard.py (code=exited, status=1/FAILURE)
Main PID: 467 (code=exited, status=1/FAILURE)
Mar 30 21:38:19 raspberrypi python3[467]: serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
Mar 30 21:38:19 raspberrypi python3[467]: During handling of the above exception, another exception occurred:
Mar 30 21:38:19 raspberrypi python3[467]: Traceback (most recent call last):
Mar 30 21:38:19 raspberrypi python3[467]: File "/home/pi/Desktop/PythonScripts/skateboard.py", line 11, in <module>
Mar 30 21:38:19 raspberrypi python3[467]: lineString = ser.readline().decode('utf-8').rstrip()
Mar 30 21:38:19 raspberrypi python3[467]: File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 509, in read
Mar 30 21:38:19 raspberrypi python3[467]: raise SerialException('read failed: {}'.format(e))
Mar 30 21:38:19 raspberrypi python3[467]: serial.serialutil.SerialException: read failed: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
Mar 30 21:38:19 raspberrypi systemd[1]: skateboard.service: Main process exited, code=exited, status=1/FAILURE
Mar 30 21:38:19 raspberrypi systemd[1]: skateboard.service: Failed with result 'exit-code'.
此外,如果它相關,這里是 python 腳本:
#!/usr/bin/python3.7
import serial
port = "/dev/ttyACM0"
ser = serial.Serial(port, 57600)
shock = 0
while 1:
while ser.in_waiting:
lineString = ser.readline().decode('utf-8').rstrip()
lineInt = float(lineString)
print(lineInt)
if(lineInt >= .4):
shock = 1
if(shock == 1 and lineInt < 5):
ser.write(b"Shock!\n")
print("shock")
shock = 0
這是.service文件
[Unit]
Description=skateboard
After=multi-user.target
[Service]
Type=simple
ExecStart=/usr/bin/python3 /home/pi/skateboard.py
Restart=on-abort
User=pi
[Install]
WantedBy=multi-user.target
正如我在上面的評論中所說,我認為問題可能是串行控制台沒有被禁用並且它吐出的消息干擾了你的程序。 所以首先要做的是確保控制台被禁用。 此處解釋了完整的過程,但非常簡單:只需在菜單上運行sudo raspi-config
和 select Interface Options ,然后運行Serial Port 。 對第一個問題回答No
”以禁用控制台,然后回答“ Yes
以出於您的目的啟用端口,重新啟動,您就完成了。
接下來你應該做的是確保運行服務的用戶( pi
)是dialup
組的成員,以便能夠訪問串行端口。 為此,只需運行:
sudo usermod -a -G dialout pi
在命令行上。
根據您的串行鏈路的可靠性(這取決於很多事情,例如布線距離、質量等),您可能需要使您的代碼更可靠以捕獲異常(也許您很幸運並且端口可以正常工作暫時還好,但在某些時候,您的設備可能無法發送數據並且您的服務將崩潰,因此在這種情況下添加異常處理不僅僅是好的做法)這樣的事情應該可以解決問題:
#!/usr/bin/python3.7
import serial
port = "/dev/ttyACM0"
ser = serial.Serial(port, 57600)
shock = 0
while 1:
while ser.in_waiting:
#Handle exception, i.e. serial port not reading anything
try:
lineString = ser.readline().decode('utf-8').rstrip()
lineInt = float(lineString)
print(lineInt)
if(lineInt >= .4):
shock = 1
if(shock == 1 and lineInt < 5):
ser.write(b"Shock!\n")
print("shock")
shock = 0
except serial.serialutil.SerialException:
print("Something went wrong, no data received!")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.