本人的项目中,应为系统的需要,需要在嵌入式环境下,实现开机自启动定时运行脚本/程序,以实现自动化。一开始是利用while 循环与 sleep 实现定时执行命令,而在了解到crond这一机制后,发现自己的嵌入式平台所搭载的Angstrom系统中也支持crontab功能,于是对其进行探究。
首先,关于什么是crontab?
crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
如何编辑、利用crontab的功能?
如要将crontab应用于当前用户,使用命令crontab -e,即可进入crontab的编辑界面。其基本格式如下:
* * * * *cmd
上述5个*分别代表分、时、天、周、月,默认情况下*即代表每一/分/时/天/周/月,也可以用*/x表示每x分/时/天/周/月。
附:个别实例
examle 1:每1分钟执行一次command
命令:
* * * * * command
examp2:每小时的第3和第15分钟执行
命令:
3,15 * * * * command
example3:在上午8点到11点的第3和第15分钟执行
命令:
3,15 8-11 * * * command
example4:每隔两天的上午8点到11点的第3和第15分钟执行
命令:
3,15 8-11 */2 * * command
example5:每个星期一的上午8点到11点的第3和第15分钟执行
命令:
3,15 8-11 * * 1 command
example6:每晚的21:30重启smb
命令:
30 21 * * * /etc/init.d/smb restart
example7:每月1、10、22日的4 : 45重启smb
命令:
45 4 1,10,22 * * /etc/init.d/smb restart
example8:每周六、周日的1 : 10重启smb
命令:
10 1 * * 6,0 /etc/init.d/smb restart
example9:每天18 : 00至23 : 00之间每隔30分钟重启smb
命令:
0,30 18-23 * * * /etc/init.d/smb restart
example10:每星期六的晚上11 : 00pm重启smb
命令:
0 23 * * 6 /etc/init.d/smb restart
example11:每一小时重启smb
命令:
* */1 * * * /etc/init.d/smb restart
example12:晚上11点到早上7点之间,每隔一小时重启smb
命令:
* 23-7/1 * * * /etc/init.d/smb restart
example13:每月的4号与每周一到周三的11点重启smb
命令:
0 11 4 * mon-wed /etc/init.d/smb restart
example14:一月一号的4点重启smb
命令:
0 4 1 jan * /etc/init.d/smb restart
example15:每小时执行/etc/cron.hourly目录内的脚本
命令:
01 * * * * root run-parts /etc/cron.hourly【1】
若在规划时间执行命令,crond会自动向用户邮箱发送一份记录。也可以自己定义一个日志文件,让其输出到该文件上。
具体方法为,在命令后加空格 >> filepath/filename
如* * * * * ntpdate 192.168.30.31 >> /home/root/cron_log.txt
注意事项:
若命令不能顺利执行成功,可能是因为环境变量的问题,如本人先前试图以如下方式执行脚本:
0*/2 * * * /home/root/BBB_WORK/CMD-TRANSMIT-2H.sh
但失败了,于是修改为:
0*/2 * * * /bin/sh /home/root/BBB_WORK/CMD-TRANSMIT-2H.sh即可!
特别注意!脚本的执行环境默认为当前用户目录,比如为用户root,则在执行脚本时,如在本机环境下,即会将当前目录当做 /home/root,因此,若涉及其他目录的操作,应该相应做出调整。(本人在脚本中利用cd命令进行切换目录)
参考资料:
【1】https://www.cnblogs.com/peida/archive/2013/01/08/2850483.html