树莓派型号:Zero W
树莓派系统:Raspbian,2018-11-13-raspbian-stretch-lite.img
Python 2.7.3
之前调试的程序但都是手动运行的,现在要让它开机自动运行。
网上搜到了3种方法:
rc.local中添加启动代码 | 按N个版本的文章试了几次都没成功 |
作为服务启动 | 测试OK |
通过桌面启动 | raspbian-stretch-lite系统不带没有桌面 |
作为服务启动的意思是,开机启动一个服务,在这个服务程序中,调用python来执行程序文件,这样程序文件就可以做到开机自动运行了。
先看一下系统已有的一些服务,进入/etc/init.d目录后列出所有内容:
pi@raspberrypi:~ $ cd /etc/init.d
pi@raspberrypi:/etc/init.d $ ls
可以随便开几个看一下里面大概是什么东西:
pi@raspberrypi:/etc/init.d $ sudo nano ssh
pi@raspberrypi:/etc/init.d $ sudo nano ntp
/etc/init.d目录下新建服务的脚本test-serial,名字最好起特别一点,防止和系统已有的冲突。
pi@raspberrypi:~ $ sudo nano /etc/init.d/test-serial
在弹出的nano编辑器中,把下面这段复制进去,保存退出:
1 #!/bin/bash 2 # /etc/init.d/test-serial 3 4 ### BEGIN INIT INFO 5 # Provides: xxxx_test_serial 6 # Required-Start: $remote_fs 7 # Required-Stop: $remote_fs 8 # Default-Start: 2 3 4 5 9 # Default-Stop: 0 1 6 10 # Short-Description: test serial functions 11 # Descrption: This service is used to start test-serial service 12 ### END INIT INFO 13 14 case "$1" in 15 start) 16 echo "Start" 17 python /home/pi/test_serial.py & 18 ;; 19 stop) 20 echo "Stop" 21 killall test_serial.py 22 exit 1 23 ;; 24 *) 25 echo "Usage:service test-serial start|stop" 26 exit 1 27 ;; 28 esac 29 exit 0
前面的几行注释也是有用的,再写新的服务时,按实际的名字和功能填一下。
start)下面的 python /home/pi/test_serial.py & ,表示用python来运行/home/pi/test_serial.py这个文件,后面的 & 表示该程序可以在后台运行,这样不会影响其他服务的运行。
切换到/etc/init.d目录,列出该目录下所有文件
pi@raspberrypi:~ $ cd /etc/init.d
pi@raspberrypi:/etc/init.d $ ls
可以看到其他的服务文件都是绿色的,而test-serial是灰色的
在Linux系统中,不同的颜色代表不同的文件类型:
蓝色 | 目录 |
绿色 | 可执行文件 |
红色 | 压缩文件 |
浅蓝色 | 链接文件 |
红色闪烁 | 链接文件异常 |
黄色 | 设备文件 |
灰色 | 其它文件 |
给test-serial文件增加执行权限,这样才能被执行调用:
pi@raspberrypi:~ $ sudo chmod +x /etc/init.d/test-serial
接着将test-serial添加到系统的启动项中:
pi@raspberrypi:~ $ sudo update-rc.d test-serial defaults
启动test-serial
pi@raspberrypi:~ $ sudo service test-serial start
查看运行状态
pi@raspberrypi:~ $ service test-serial status
重启树莓派,查看服务是否自动启动
pi@raspberrypi:~ $ sudo shutdown -h now
pi@raspberrypi:~ $ service test-serial status
数据远程采集项目中,用到下面两个程序,采用上述的方法,用两个服务分别开机启动运行:
xx_monitor.py | 通讯、存储 |
xx_upload.py | 上传数据文件 |
删除文件的执行权限
pi@raspberrypi:~ $ sudo chmod -x /etc/init.d/test-serial
删除系统启动项
pi@raspberrypi:~ $ sudo update-rc.d -f test-serial remove
如果修改了服务脚本,再次使用到服务中的指令时,会提示要重载,按提示输入:
pi@raspberrypi:~ $ systemctl daemon-reload
这时又提示需要root权限,但是之前还没有设置过root相关的东西。
设置root账户的的密码:
pi@raspberrypi:~ $ sudo passwd root
开通root账户:
pi@raspberrypi:~ $ sudo passwd --unlock root
再运行systemctl daemon-reload,提示成功
pi@raspberrypi:~ $ systemctl daemon-reload