• 树莓派:最好的安排


    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载。

     

    树莓派是一款低成本的电脑,因此它的一个应用场景就是充当小型的服务器。我平时就会在自己的局域网下接入一个树莓派,做一些数据备份和上传的工作。这种时候,我们希望减少对树莓派的直接操作,就可以采用一些任务规划的手段,来让树莓派自动执行任务。

    shutdown

    reboot

    sleep 10 

    用cron规划任务

    cron是UNIX系统下常用的任务规划软件。你可以在cron中要求系统在特定的时间执行特定的任务。cron在系统中有一个运行着的守护进程。当系统时间符合某一条规划记录时,守护进程就会启动相应的任务。在树莓派应用行中运行下面命令,就可以找到cron的守护进程:

    ps aux | grep cron

     

    结果如下:

    root       424  0.0  0.2   5072  2384 ?        Ss   14:40   0:00 /usr/sbin/cron -f
    pi        6938  0.0  0.2   4280  2008 pts/1    S+   17:42   0:00 grep --color=auto cron

    记录中的第一条,就是cron的进程。

     

    如果想要规划任务,那么可以用下面的命令来编辑规划记录:

    crontab -e

    在规划记录中,每一行为一条记录,#开始的是注释。每一行记录又分为6列,用空格分隔,分别表示分钟(m,0-59)、小时(h,0-23)、一个月中的哪一天(dom,1-31)、月(mon,1-12)、一个星期中的哪一天(dow,0-6)、以及要执行的命令。在填写规划时间的时候,除了用数字,还可以用*,用来表示所有:

     

    # m h  dom mon dow   command
     30 5   10   3   *   touch /tmp/test.log

    上面表示每年3月10号5点30分,执行touch /tmp/test.log。

     

    # m h  dom mon dow   command
     10 18   *   *   *   echo "Hello World" > /home/pi/log

    每天的18点10分执行echo "Hello World" > /home/pi/log。

     

    一列中,还可以规划多个时间点,例如:

    # m h  dom mon dow   command
     10 2-4  *   *   *   echo "Hello World" > /home/pi/log

    每天2:10、3:10和4:10执行。也就是说,“N-M”表示了从N到M的范围。

     

    # m h  dom mon dow   command
     30 1,5  *   *   *   echo "Hello World" > /home/pi/log

    每天1:30和5:30执行。也就是说,“N,M”表示了N和M两个时间点。

     

    规划记录crontab保存后,cron就将按照规划,在对应的时间执行对应的命令。每个用户有一个自己的crontab,当cron要执行规划时,也会以相应的用户身份来执行。我是以pi用户修改保存的crontab,cron就会以pi的身份来运行各个命令。如果想修改其他用户的crontab,那么可以用-u关键字:

    sudo crontab -e -u root

     

    用cron来开机启动 

    cron除了做时间规划,还可以用于开机启动。在crontab中添加下面一行记录,就可以方便的实现:

    @reboot touch /home/pi/reboot.log

     

    用/etc/init.d实现开机启动

    在树莓派下的/etc/init.d文件夹下有很多脚本,比如我们已经了解了的cron。这个cron脚本把cron这个守护进程包装成了一个服务,定义了它在启动、重启和终止时的具体行为。这样,用户在启用相应的服务时,就不需要进行太复杂的设置。当服务终止时,操作系统也能根据脚本的定义,自动地回收相关资源。用户还能把重要的服务设置成开机启动,省了手动开启的麻烦。因此,我们在/etc/init.d中内看到很多默默工作的服务,如ssh、bluetooth、rsync等。

     

    服务脚本遵循特定的格式。如下面的/etc/init.d/test脚本:

    #!/bin/sh
    # Start/stop the test daemon.
    #
    ### BEGIN INIT INFO
    # Provides:          test
    # Required-Start:    $remote_fs $syslog $time
    # Required-Stop:     $remote_fs $syslog $time
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: test
    # Description:       test
    ### END INIT INFO
    
    do_start() {
        echo "start"
    }
    
    do_stop() {
        echo "stop"
    }
    
    do_restart() {
        echo "restart"
    }
    
    do_status() {
        echo "status"
    }
    
    do_fallback() {
        echo "fallback"
    }
    
    case "$1" in
    start)  do_start
            ;;
    stop)   do_stop
            ;;
    restart) do_restart
            ;;
    status) do_status
            ;;
    *)      do_fallback
            ;;
    esac
    exit 0

     

    脚本的一开始有头部信息。头部信息中除了基本的介绍,还有其他信息。Required-Start说明了该test应用启动前,系统必须启动的其他应用。Required-Stop列出的应用必须在test应用结束后结束。Default-Start和Default-Stop中说明的默认运行级别。Unix系统可以在不同运行模式下工作,如单用户模式、多用户模式,每种模式就称为一个运行级别。大多数UNIX系统遵照: 

    运行级别:
    0 停机,关机
    1 单用户,无网络连接,不运行守护进程,不允许非超级用户登录
    2 多用户,无网络连接,不运行守护进程
    3 多用户,正常启动系统
    4 用户自定义
    5 多用户,带图形界面
    6 重启

    test脚本中,默认支持的运行级别是2、3、4、5。

     

    在脚本的主体程序中包含了一个case分支结构,说明了应用在进入启动(start)、停止(stop)、重启(restart)、状态查询(status)状态时应该采用的动作。我们可以用service命令来手动让脚本切换状态:

    sudo service test start

    脚本中相应的动作会被调用。

     

    /etc/init.d/myscript还不能随机启动。Linux在开机启动时,真正检查的是/etc/rcN.d文件夹,执行其中的脚本。这里的N代表了运行级别。比如说在运行级别2时,Linux会检查/etc/rc2.d文件夹,执行其中的脚本。我们需要把/etc/init.d中的服务复制到或者建立软连接到/etc/rcN.d,才能服务在该运行级别的开机启动。不过,我们可以利用update-rc.d命令更便利地进行:

    sudo update-rc.d cron defaults # 按照默认支持的运行级别建立软链接
    sudo update-rc.d cron remove   # 删除软链接

     

    避免使用/etc/rc.local

    树莓派官网上给出了修改/etc/rc.local的方法,来在树莓派开机时执行用户自定义的任务。比如在该文件中执行date命令:

    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    
    # time
    date > /tmp/rc.local.log
    
    exit 0

    但这种启动方式不推荐。/etc/rc.local是在系统初始化的末尾执行的一个脚本。如果把太多的任务加入到这个脚本中,不但会拖慢开机的速度,还会造成管理上的混乱。因此,/etc/rc.local往往只用于修改一些在启动过程需要设定的参数,而不涉及具体的任务启动。如果想随开机启动某些服务,应该避免使用/etc/rc.local。

     

    总结

    本章主要介绍了用cron实现树莓派上的任务规划,以及用多种方式来实现开机启动程序。

    欢迎阅读“骑着企鹅采树莓”系列文章 

  • 相关阅读:
    Java实现 LeetCode 69 x的平方根
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 68 文本左右对齐
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 67 二进制求和
    Java实现 LeetCode 66 加一
    Java实现 LeetCode 66 加一
    CxSkinButton按钮皮肤类
  • 原文地址:https://www.cnblogs.com/vamei/p/6279789.html
Copyright © 2020-2023  润新知