[英]Python script does not restart properly with systemd
我正在学习如何在出现错误时重新启动 Python 脚本(遵循本教程,但是对文件名等进行了一些小调整)。 首先,需要的文件:
/home/myuser/Desktop/test/test.py
:from datetime import datetime
from time import sleep
path = "/home/dec13666/Desktop/test/log.txt"
while True:
with open(path, "a") as f:
now = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
f.write(now+"\n")
f.close()
sleep(1)
davidcustom.service
:[Unit]
Description=Python Script Made By Me
After=multi-user.target
[Service]
RestartSec=10
Restart=always
ExecStart=python3 /home/myuser/Desktop/test/test.py
[Install]
WantedBy=multi-user.target
最后,命令运行:
sudo nano /etc/systemd/system/davidcustom.service
sudo systemctl daemon-reload
sudo systemctl enable davidcustom.service
sudo systemctl start davidcustom.service
sudo systemctl status davidcustom.service
我收到的消息:
● davidcustom.service - Python Script Made By Me
Loaded: loaded (/etc/systemd/system/davidcustom.service; enabled; vendor preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Sun 2022-09-04 14:12:12 EDT; 8s ago
Process: 3341 ExecStart=python3 /home/myuser/Desktop/test/test.py (code=exited, status=1/FAILURE)
Main PID: 3341 (code=exited, status=1/FAILURE)
CPU: 100ms
笔记:
test.py
时,它工作正常,但是 python 脚本是从服务运行的(如此处所示),它会生成该错误。davidcustom.service
( [Service]
)中设置User=myusername
和Type=simple
,结果没有区别。我究竟做错了什么?
ExecStart
需要可执行文件的绝对路径,它不搜索$PATH
。 所以使用
ExecStart=/usr/bin/python3 /home/myuser/Desktop/test/test.py
(假设这是安装python3
的地方——您可以使用type python3
来获取实际位置)。
我无意中在原始代码中添加了一些错误的缩进(现在在原始帖子中更正了)。 这解决了我的问题; 运行sudo systemctl status davidcustom.service
时,现在该服务active
:
● davidcustom.service - Python Script Made By Dave
Loaded: loaded (/etc/systemd/system/davidcustom.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2022-09-04 16:16:02 EDT; 23ms ago
Main PID: 4287 (python3)
Tasks: 1 (limit: 14215)
Memory: 3.0M
CPU: 16ms
CGroup: /system.slice/davidcustom.service
└─4287 python3 /home/dec13666/Desktop/test/test.py
其他值得牢记的建议,但对我的情况来说不是必需的(感谢@Barmar 和@tdelaney):
ExecStart
处使用绝对路径(通过运行which python
命令很容易获得)[Service]
中,在您的服务脚本中:[Service]
RestartSec=10
Restart=always
ExecStart=/usr/bin/python3 /home/myuser/Desktop/test/test.py
User=youruser
Group=yourgroup
谢谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.