本篇为上一篇的续 树莓派 -- 根据 CPU 温度控制风扇起停
有了散热的硬件和软件,接下来我们让树莓派开机的时候,自动启动风扇控制程序

准备文件

/opt/airfan.py

根据上篇的文章提到的代码,保存为 /opt/airfan.py 也可以去这里下载代码oschina-gist

/etc/init.d/airfan

将下面的代码保存到 /etc/init.d/airfan 文件中(根据惯例)

#!/bin/sh

### BEGIN INIT INFO
# Provides:        airfan
# Required-Start:  $network $remote_fs $syslog
# Required-Stop:   $network $remote_fs $syslog
# Default-Start:   2 3 4 5
# Default-Stop: 
# Short-Description: Start Airfan daemon
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

case "$1" in
    start)
        echo "Start Airfan"
        python -u /opt/airfan.py > /var/log/airfan.log &
        ;;
    stop)
        echo "Stop Airfan"
        ps aux | grep 'airfa[n]' | awk '{print $2}' | xargs kill
        ;;
    *)
        echo "Usage: service airfan <start|stop>"
        exit 1
        ;;
esac
exit 0

增加可执行权限 chmod +x /etc/init.d/airfan

具体解释下每个部分的含义

### BEGIN INIT INFO
# Provides:        airfan
# Required-Start:  $network $remote_fs $syslog
# Required-Stop:   $network $remote_fs $syslog
# Default-Start:   2 3 4 5
# Default-Stop: 
# Short-Description: Start Airfan daemon
### END INIT INFO

这段注释,是 Debian 系统中一个叫insserv的程序依赖的。update-rc.d依赖的则是insserv这个程序。没有这段注释的话就是出来各种 Warning。

加入到开机自动启动

$ update-rc.d airfan defaults

执行完命令之后会发现,再/etc/rc2.d里面发现一个软连接S01u2init -> ../init.d/u2init
rc2.d 代表 runlevel2 的时候执行。其中的 S 表示启动(K 代表停止),01 代表优先级,数字越大执行越靠后。

RunLevel 解释

文件 /etc/init.d/airfan的注释中,有一句 # Default-Start: 2 3 4 5 其中的2 3 4 5代表 linux 系统中的 runlevel

runlevel 分为 6 个不同的等级

通过 runlevel命令可以查看当前的 runlevel。通常的系统都是5(就算是你下载的 server 版的 linux 系统,通常的 runlevel 也是 5), 使用init命令可以切换 runlevel。比如init 6即执行重启的功能。init 1就切换到了单用户模式。

当运行在 runlevel 5(正常模式下),操作系统在启动时会依次遍历目录 /etc/rcS.d/etc/rc5.d。 检查目录下以S开头的软链接,然后执行 start 操作。根据后面的数字来设置执行顺序。

文件名的结构通常是 S03keyboard-setup -> ../init.d/keyboard-setup

参考文章


↙↙↙阅读原文可查看相关链接,并与作者交流