我有一个 Raspberry Pi,它有一个 I2C 16x2 显示屏。屏幕上只显示“欢迎”。
问题:我希望这个脚本在 Raspberry Pi 打开电源后立即运行。
我将以下命令添加到我的 rc.local 文件 sudo python /path/to/file 它将自动启动,但在脚本运行之前需要 45 秒或更长时间。
有没有办法在 Raspberry Pi 通电后或开机后 10 秒内启动 python 脚本或在屏幕上显示?
答案1
Systemd 可以通过强制执行您在服务的单元文件中指定的依赖关系,有条件地启动相对于另一个服务的服务。我遇到了与您类似的问题,我需要按特定顺序执行脚本,因此我为其创建了一个 systemd 服务并启动了我的自定义服务后另一项服务。
听起来比做起来难。并不是很复杂,值得了解以供将来参考。
这是一个 (2) 步骤过程:
第 1 步:分析订单服务的增长
在您可以指定条件关系来启动脚本之前(作为一项服务) 任何一个前或者后在服务的单元文件中,您需要了解服务何时以及如何启动。
以下命令将绘制服务启动及其各自开机时间的图表:
sudo systemd-analyze plot > /home/pi/services-startup.svg
使用以下方式打开文件图片浏览器您可以从系统启动中看到服务何时启动。
用于理解服务之间依赖关系的其他工具:
sudo systemd-analyze critical-chain
sudo systemd-analyze critical-chain someServiceName.service
tree /etc/systemd/system
步骤 2:为您的脚本创建自定义服务以强制执行订单依赖性
有许多指令可用于创建服务之间的依赖关系,Before
其中After
最明显的是:
https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Before=
单元文件示例:
我有一个脚本,用于通过电子邮件发送无头 Pi 的 IP 地址,但由于脚本(作为服务运行)的执行顺序而失败。我完成了上述分析并创建了以下单元文件配置来执行我的脚本一次性服务。它通过等待启动我的自定义服务来实现这一点,直到后服务motion
完成:
cat <<EOF> /etc/systemd/system/email-camera-address.service
[Unit]
Description=Email IP Address of Camera on Boot
Requires=network-online.target
After=motion.service
[Service]
User=pi
Group=pi
Type=oneshot
ExecStart=$PATHSCRIPTS/email-camera-address.sh
[Install]
WantedBy=multi-user.target
EOF
chmod 644 /etc/systemd/system/email-camera-address.service
systemctl enable email-camera-address.service
上面的完整脚本可以找到这里: