树莓派用一个回形针来安全关机
刚买Zero W的时候最头疼的一件事就是如何安全关机。有好几次Zero W SSH连接不上,只能强行断电结果把系统给搞坏了。可能是磁盘还在读写,意外断电,会让磁盘丢失资料。
可惜的是Zero W短路了,我不得不上咸鱼淘了一个二手1代B型来替代它。
树莓派1B是第一代树莓派产品,只有26个引脚,和后面的几代40个引脚的都不同。虽然引脚数不同,但是只要有GPIO引脚就能够实现安全关机。具体的做法是,树莓派运行一个脚本来监视GPIO引脚,如果发现状态变化,就执行关机命令。可以用一根回形针(任何导电物品)连通两个引脚,来发出关机命令。具体可以参照这篇文章。
首先下载并编译脚本,github上有开源的代码
1 | git clone https://github.com/adafruit/Adafruit-GPIO-Halt |
接下来将编译后的gpio-halt
脚本移到/usr/local/bin
目录下
1 | sudo mv gpio-halt /usr/local/bin |
创建一个服务方便启动或关闭gpio-halt
脚本,可以使用update-rc.d
命令来自动创建。首先在/etc/init.d
目录下创建一个gpio-halt.sh
脚本文件,内容如下
1 | #!/bin/sh |
注意,上面的参数7是7号GPIO引脚的意思,如果是1B以后的树莓派,即40引脚的,应该改成21号引脚。
然后添加执行权限给gpio-halt.sh
脚本文件
1 | sudo chmod +x /etc/init.d/gpio-halt.sh |
使用update-rc.d
命令创建服务
1 | sudo update-rc.d gpio-halt.sh defaults |
执行上面的命令后,系统会向/run/systemd/generator.late/
目录添加一个service,这样我们就可以使用sudo service gpio-halt.sh start|stop|status
命令来控制脚本运行。
我之前就发现一个问题,网上说使用update-rc.d
命令会自动设置脚本开机启动,但是我尝试重启了一遍后发现gpio-halt.sh
脚本服务并没有自启,还是需要手动开启,问题就出在gpio-halt.sh
脚本文件上。正确的写法应该参照LSBInitScripts
的规范来,比如
1 | #!/bin/sh |
上面的脚本我只是举个例子,没有实际的执行代码,目前还不会写。于是为了能快速实现开机自启,我在/etc/rc.local
文件里添加了一行代码
1 | #!/bin/sh -e |
现在再重启一下试试,看看gpio-halt.sh
服务有没有自启。如果已经启动,找一根回形针,最好接上屏幕观察一下,接通GND以及GPIO7引脚,看看是不是关机了呢?反正我是可以了。以后可以弄一个开关接GND以及GPIO7,开关按下就可以实现安全关机。