1 程序自启动

之前在树莓派上写的程序,都是通过ssh连接后在控制台上用命令行启动的,这种方式适合测试和调试,完善好程序后,比较好的方法是把程序设置为开机自启动,这样树莓派一上电就开始运行程序。查阅网上的资料,主要有三种方法,一是在rc.local添加启动项;二是在~/.config/autostart中添加桌面启动应用;三是在/etc/init.d/中添加服务项。

2 编辑测试程序


首先编辑一个python程序用来测试,这个测试程序最好是个通过GPIO驱动LED灯闪烁的程序,通过在控制台输出信息的方法不太合适,控制台未必显示。或者参考我的测试程序,一个UDP数据发送程序,如果启动的话就不停地发送字符串,文件名为Auto_Start_Demo.py,内容如下:

 #!/usr/bin/python
import socket
import time

HOST='192.168.191.1'
PORT=9999

server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
server.connect((HOST,PORT))
data='123'

try:
    while True:
        server.sendall(data.encode(encoding='utf-8'))
        time.sleep(1)
except:
    server.close()

然后执行suo chmod 755 Auto_Start_Demo.py 命令赋予操作权限。
相应的,在自己电脑上写个接收程序:

import socket

HOST='192.168.191.1'
PORT=9999
bufsize=1024

server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
server.bind((HOST,PORT))
while True:
    data,addr=server.recvfrom(bufsize)
    if len(data)==1 and data[0]==1: #windows上可能没法用ctrl+c强制跳出程序,这里指定收到0x01时结束程序 
        server.close()
        exit()
    data=data.decode(encoding='utf-8')
    print(data)

调试一下,因为是用UDP,随便先启动哪个程序:

3 通过rc.local自启动

执行sudo vim /etc/rc.local 命令编辑rc.local文件,在exit 0 上面一行添加语句/home/pi/Auto_Start_Demo.py & ,表示运行Auto_Start_Demo.py文件(在文件代码中已经指定了用python运行),而& 符号可以简单理解为让程序运行在后台。
然后执行sudo reboot 重启树莓派,记得把自己电脑上的接收程序提前打开,看看能不能接收到数据。
尝试了多次,发现该方法并不能保证成功,用reboot 重启的话成功率还高点,断点重启的话基本都不行。此外,成功的时候如果输入ps -ef | grep Auto_Start来查看进程情况,发现竟然有两个一样的进程。

4 通过桌面应用自启动

进入用户目录下的.config目录(为隐藏目录),里面如果没有autostart目录的话就新建一个,然后在autostart目录下新建Auto_Start_Test.desktop文件,编辑内容如下:

[Desktop Entry]
Type="Application"
Exec="/home/pi/Auto_Start_Demo.py &"

接着重启树莓派进行测试。因为这种方法一般是用于桌面应用的自启动,我预想应该是不行的,结果还是成功了,但是也不是每次都有效。

5 通过服务脚本自启动

执行ls /etc/init.d 可以看到该目录下有很多服务程序文件,在这里添加自己的服务文件,就可以对其进行配置从而实现自启动。在该目录下新建文件Auto_Start_Test,编辑内容:

#!/bin/bash
### 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 "Stat"
        /home/pi/Auto_Start_Demo.py&
        ;;
    stop)
        echo "Stop"
        killall Auto_Start_Demo.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 开放权限。
接着执行sudo update-rc.d Auto_Start_Test defaults 将该服务添加到自启动项,这样应该就可以奏效了。可以先手动启动服务来测试,执行sudo service Auto_Start_Test start 启动服务,执行sudo service Auto_Start_Test stop 停止服务。
重启树莓派查看效果,可以看到效果良好,无论是reboot重启还是断电重启,都能实现程序的自启动,下图是线程信息。

6 结论

用rc.local或桌面应用的方法操作比较简单,但是效果并不好,而通过服务配置的方式,效果良好。