【问题标题】:Daemonize a Python script on Raspbian Buster在 Raspbian Buster 上守护 Python 脚本
【发布时间】:2021-12-14 03:58:36
【问题描述】:

我正在开发一个基于 RFID 的访问控制系统,我有一个可用的 Python 脚本。对于一些重要的具体细节,主要处理是在一个 pi 零 w 上完成的,它通过 USB 连接到一个微控制器,该微控制器处理来自 RFID 模块的输入并将其以字符串格式发送到 pi 为简单起见。然后,pi 将收到的字符串与 yaml 文件和时间表进行比较,并使用 GPIO 使用电源打开或关闭门锁。我遇到的问题是脚本在大约 30 分钟后停止运行,我不太确定为什么,但我认为无论如何理想的解决方案是守护它,因为 cron 作业太容易失败并且守护进程似乎非常适合这种用途。是否有人对脚本的守护进程有任何建议,以便它在启动时启动并在检测到故障或不再运行时自行重新启动?

【问题讨论】:

  • 您应该创建systemd unit 来启动和管理您的脚本。这将允许您让它在启动时启动,并在它失败时自动重新启动。你会发现很多关于编写 systemd 单元的指南,并进行一些基本的搜索。

标签: python daemon


【解决方案1】:

正如 larsks 所说,您可以创建 systemd 服务

sudo nano /etc/systemd/system/yourscript.service

这个文件应该是这样的(阅读documentation了解更多信息):

[Unit]
Description=My cool script
After=multi-user.target

[Service]
User=root
WorkingDirectory=/path/to/your/script/directory/
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/python3 your_script.py
StandardOutput=append:/var/log/your_script.log
StandardError=append:/var/log/your_script.log
SyslogIdentifier=coolawesomescript

[Install]
WantedBy=multi-user.target

然后启用并启动它:

foo@bar:~$ sudo systemctl enable yourscript
foo@bar:~$ sudo systemctl start yourscript

现在你的脚本会在崩溃时自动重启

你可以通过输入sudo systemctl status yourscript来检查你的脚本是否真的有效

【讨论】:

  • 我尝试了您的解决方案,但我得到了无效参数的退出代码 2,我认为这与解析有关。这是我的 execstart 行:ExecStart=/usr/bin/python3 "/path/to/pyscript -k /path/to/configfile" 因为我的 python 脚本采用命令行参数。这是否支持,如果支持,我如何让系统将其解析为传递给 python3 的单个令牌而不是三个单独的参数(我认为目前正在发生)?谢谢!
  • 不要使用引号:ExecStart=/usr/bin/python3 /path/to/pyscript -k /path/to/configfile
  • 先试过了,不幸的是,同样的错误代码也没有用。
  • 那你可以试试ExecStart=/bin/bash -c "/usr/bin/python3 /path/to/pyscript -k /path/to/configfile"
猜你喜欢
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
相关资源
最近更新 更多