前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >树莓派:最好的安排

树莓派:最好的安排

作者头像
Vamei
发布2018-09-25 17:34:09
8670
发布2018-09-25 17:34:09
举报
文章被收录于专栏:Vamei实验室

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

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

shutdown

reboot

sleep 10 

用cron规划任务

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

代码语言:javascript
复制
ps aux | grep cron

结果如下:

代码语言:javascript
复制
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的进程。

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

代码语言:javascript
复制
crontab -e

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

代码语言:javascript
复制
# m h  dom mon dow   command
 30 5   10   3   *   touch /tmp/test.log

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

代码语言:javascript
复制
# m h  dom mon dow   command
 10 18   *   *   *   echo "Hello World" > /home/pi/log

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

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

代码语言:javascript
复制
# 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的范围。

代码语言:javascript
复制
# 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关键字:

代码语言:javascript
复制
sudo crontab -e -u root

用cron来开机启动 

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

代码语言:javascript
复制
@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脚本:

代码语言:javascript
复制
#!/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系统遵照: 

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

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

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

代码语言:javascript
复制
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命令更便利地进行:

代码语言:javascript
复制
sudo update-rc.d cron defaults # 按照默认支持的运行级别建立软链接
sudo update-rc.d cron remove   # 删除软链接

避免使用/etc/rc.local

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

代码语言:javascript
复制
#!/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实现树莓派上的任务规划,以及用多种方式来实现开机启动程序。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-01-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 用cron规划任务
  • 用cron来开机启动 
  • 用/etc/init.d实现开机启动
  • 避免使用/etc/rc.local
  • 总结
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档