先介绍一下systemd
- systemd 这个名称来源于 “system” 和 “daemon” 的组合:
- system:表示它是一个系统级的管理工具,负责管理整个系统的启动和服务。
- daemon:在 Unix/Linux 系统中,daemon(守护进程) 是指在后台运行的程序,通常用于提供服务。
- 因此,systemd 可以理解为一个用于管理系统和服务的后台程序。它的设计旨在替代传统的初始化系统(如 SysVinit)以提供更高效的服务管理、并行启动和依赖关系管理等功能。
一个实用例子
最近使用树莓派做了一个颜色跟随的小车,小车就得脱离电源线和视频线实现开机即运行python脚本,可以使用systemd设置实现。
已在树莓派 4b 和树莓派 zero 2W 实验成功。
1. 创建 systemd 服务单元文件
systemd 使用单元(unit)文件来描述和管理服务、设备、挂载点等。单元文件通常位于 /etc/systemd/system/ 或 /lib/systemd/system/ 目录下:
- 打开终端,使用你喜欢的文本编辑器(如 nano、vim 或 gedit)创建一个新的服务单元文件。例如,你可以命名为 myscript.service:
sudo nano /etc/systemd/system/myscript.service
- 在文件中输入以下内容,根据你的脚本路径和需求进行修改:
- Description=My Custom Script:这是对该服务的简短描述,用于在 systemctl status 命令输出中显示,方便用户理解该服务的目的。
- After=network.target:表示该服务将在网络服务启动后才启动,确保网络可用,适合需要网络连接的脚本。
- After=multi-user.target:表示该服务将在多用户目标达到后启动,确保系统已进入正常工作状态,适合需要与用户会话交互的服务。
- Restart=on-failure:定义服务的重启策略。如果该服务由于非正常原因(例如崩溃)退出,将会自动重启。
- StandardOutput=journal 和 StandardError=journal:将标准输出和标准错误输出重定向到 systemd 日志系统(journald),方便后续使用 journalctl 查看日志,便于调试和监控。
- WantedBy=multi-user.target:指定该服务在 multi-user.target 目标下自动启动。通过 systemctl enable 命令可以将该服务设置为开机自启。
[Unit]
Description=My Custom Script
After=network.target multi-user.target
[Service]
ExecStart=/usr/bin/python3 /home/pi/Desktop/project/main.py # 改成你的脚本路径
Restart=on-failure
RestartSec=10 # 设置在重启服务之前等待的时间,这里是 10 秒。可以防止服务频繁崩溃导致快速重启。
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
- Ctrl + X 保存并关闭文件。
2. 重新加载 systemd 配置
每当你修改了 systemd 的服务单元文件后,都需要重新加载 systemd 配置,以确保它识别到新的或修改过的服务。
sudo systemctl daemon-reload
3. 启用并启动服务
- 启用服务,使其在系统启动时自动运行:
sudo systemctl enable myscript.service
- 立即启动服务(如果你希望现在就运行它)
sudo systemctl start myscript.service
4. 检查服务状态
你可以使用以下命令来检查服务的状态,确保它正在运行且没有错误:
sudo systemctl status myscript.service
5. 重启树莓派
reboot
6. 调试和日志
- 如果服务没有按预期运行,你可以先看看是不是你的python脚本没有执行权限,没有可以执行命令:
sudo chmod +x /home/pi/Desktop/project/main.py
- 或者查看 systemd 的日志来获取更多信息:这将显示与 myscript.service 相关的所有日志条目,帮助你诊断问题。
- -f:实时跟踪日志输出,适合监控服务运行状态:
journalctl -u myscript.service -f