一. 程序自启动
之前在树莓派上写的程序,都是通过ssh连接后在控制台上用命令行启动的,这种方式适合测试和调试,完善好程序后,比较好的方法是把程序设置为开机自启动,这样树莓派一上电就开始运行程序。查阅网上的资料,主要有三种方法,一是在rc.local添加启动项;二是在~/.config/autostart中添加桌面启动应用;三是在/etc/init.d/中添加服务项。
二. 编辑测试程序
首先编辑一个python程序用来测试,这里以一个简单树莓派控制LED灯闪烁为例,文件名为led.py
。
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(21,GPIO.OUT)
#休眠20s等待系统初始化
time.sleep(10)
while True:
try:
GPIO.output(21,True)
time.sleep(1)
GPIO.output(21,False)
time.sleep(1)
except (KeyboardInterrupt, SystemExit):
GPIO.close()
print "exit"
1. #!/usr/bin/env python 不可以缺少。
2. 程序中如果有cv2.imshow('frame', frame),一定要注释掉。
3. 在程序开始尽量加上time.sleep(10),延时10ms,等待系统初始化。
终端输入
sudo chmod 777 /home/pi/led.py
给你的py文件增加权限
三. 通过服务脚本自启动
执行ls /etc/init.d
可以看到该目录下有很多服务程序文件,在这里添加自己的服务文件,就可以对其进行配置从而实现自启动。在该目录下新建文件Auto_Start_Test,编辑内容:
可以使用sudo nano /etc/init.d/Auto_Start_Test来编辑Auto_Start_Test文件。
#!/bin/bash
#/etc/init.d/Auto_Start_Test
### BEGIN INIT INFO
# Provides: Auto_Start_Test
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Auto Start Test
# Descrption: This service is used to test auto start service
### END INIT INFO
case "$1" in
start)
echo "Start"
nohup python3 /home/pi/led.py&
;;
stop)
echo "Stop"
killall led.py
exit 1
;;
*)
echo "Usage:service Auto_Start_Test start|stop"
exit 1
;;
esac
exit 0
这是一个bash脚本,指定了用start和stop命令进行服务的启动和停止,“BEGIN INIT INFO”那段注释是LSB标准说明,有的博客可能会说写不写都行,但我建议一定要留下,因为我之前删除了就一直不好使。保存文件,执行sudo chmod 777 Auto_Start_Test 开放权限。
设置python脚本开机启动
sudo service Auto_Start_Test start #启动 操作A
sudo service Auto_Start_Test stop #停止
#最后设置开机启动就好了 操作B
sudo update-rc.d Auto_Start_Test defaults
这样就完工了,重启树莓派就会发现led自己闪烁了。
操作A失败则报错:
操作B失败则报错:
操作B成功则:
重启后!!! ps -ef | grep Auto_Start 查看线程信息
最后sudo systemctl enable Auto_Start_Test.service开启服务。重要!!!
sudo systemctl status Auto_Start_Test.service ,查看服务状态。通过这个命令可详细查看为啥自启动服务无法运行。服务启动状态报错:
若出现如下情况
是因为ubuntu系统启动程序默认使用python2.7,而opencv则安装在python3.7环境中。
先使用ls /usr/bin/python *查看系统中存在的python版本
然后移除软连接,更改python默认版本
sudo rm /usr/bin/python
sudo ln -s /usr/bin/python3.7 /usr/bin/python