繁体   English   中英

Python 脚本无法使用 systemd 正确重启

[英]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=myusernameType=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命令很容易获得)
  • 如果您只想使用您的用户和/或组,那么明确地编写这些参数。
  • 前面的 2 条建议应添加到[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM