当前位置: 首页 > 编程日记 > 正文

cron 工具 每分钟_计划任务 cron和crontab

很多时候,我们需要定时执行某个应用或者某段脚本,在linux上,可以使用cron服务,它有点类似于Windows上的任务计划程序。这篇文章将简单介绍cron的使用。

1. crond和crontab

首先需要分清楚两个概念:crond和crontab。crond是后台守护进程的名称(d代表daemon),用来实际执行脚本,它在系统中是一直运行的。可以通过下面的方式查看到它:

# systemctl | grep crond
crond.service loaded active running Command Scheduler

crontab是一个工具,用来列出cron中当前运行的作业(应用或脚本等)、向cron中添加作业、编辑作业、删除作业。它并不是一直在后台运行的,是一个短时的命令行工具,执行完就结束了。可以简单理解crond和crontab组合起来提供cron服务。

2. crontab的常用命令

因为crond是一个守护进程,所以在系统开机后,通过systemctl start crond启动一次以后(默认自动启动的),几乎就不需要再管它了,之后的操作都通过crontab来完成。

2.1 查看现有任务

# crontab -l
no crontab for root

因为现在没有任务,所以显示的是 no crontab for root,可见,任务是根据用户进行区分的。

2.2 添加定时任务

为了便于测试,我们可以创建这样一个简单的脚本(位于~/tmp/job1.sh):在一个文件末尾追加当前时间。脚本如下:

date +'%F %T' >> ~/tmp/job1.log

创建完成后记得赋予一下执行权限:

# chmod 755 job1.sh

接下来,需要配置多久运行一次。这里通过cron表达式来设置,它非常灵活,可以很简单也可以很复杂。cron表达式的应用广泛,不止用在系统层面,在其他各种编程语言的类库当中,都有类似的实现,语法略有不同。使用下面的命令可以查看linux系统中cron表达式的写法:

# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

如果需要查看更详细的用法,可以使用 # man crontab 命令查看。

整理后如下表所示:

注意:不同的cron应用存在很大差异,比如crontab不支持“秒”,特殊字符也支持的比较少(支持,-*/)。而其他一些应用,则支持“秒”和更多的特殊字符。这里为了更完备一些,所以全都列出来了,省的以后再去总结。
名称必须取值范围可设置的特殊字符
0-59,-*/
0-23,-*/
日(月)1-31,-*?/LW
1-12 或者 jan-dec,-*/
日(周)0-7(0和7都是星期天)
或者 sun-sat
,-*?/L#
留空,1970-2099,-*/

几个特殊字符的含义:

字符含义
*全部。意思是在该时间的任意点都应当执行
?不指定,任意。仅用于 日(月)和日(周)。0 0 5 * ? 代表每个月的第5天零点,不论星期几。
0 0 ? * 1 代表每周一,不论是当月的哪天。
,多个值的分隔符,例如1,5,10
-代表连续值,例如1-20
/步长。例如 5/15,代表从5开始,以15为步长。因此,当5/15位于分钟的位置时,表示小时内的第5、20、35和50分钟。
L最后一天。可以是每月最后一天或者每周最后一天。如果用在 天(周)字段,并且前面加数字,则表示最后一个周N。例如5L,表示最后一个周五(5表示周五,L表示最后)。
W工作日,指周一到周五的任意一天
#表示第几个的意思,例如 6#3,表示当月第3个星期六(6表示周六,3表示第3个)

几个简单的例子:

表达式含义
* * * * *每分钟执行一次
30 * * * *每小时的30分执行一次
*/5 * * * *每5分钟执行一次
0/5 * * * *每5分钟执行一次,且仅在0,5,15,20...55分执行
5 0 * * *每天的00:05执行一次
注意:crontab中 日(周)不接受“?”的写法,在很多其他应用中则可以,例如Quartz.Net库:https://www.quartz-scheduler.net/
提示:更多的用法,可以参考:https://crontab.guru

接下来,如果我们想要每分钟执行一下前面创建的job1.sh脚本,需要再创建一个crontab作业(jobs.cron,后缀名无所谓,这里只是为了便于识别),其中包含了cron表达式,用于表明job1.sh执行的周期:

* * * * * ~/tmp/job1.sh

使用crontab将它加入到计划中:

# crontab jobs.cron

再次查看当前计划,可以看到这样的结果:

# crontab -l
* * * * * ~/tmp/job1.sh

2.3 删除定时任务

先将job1.sh复制一份,稍作修改,然后编辑一下jobs.cron,将job2.sh也加入进去:

* * * * * ~/tmp/job1.sh
*/5 * * * * ~/tmp/job2.sh

然后重新加入到cron服务中。

# crontab jobs.cron

接着查看一下当前cron中的作业:

# crontab -l
* * * * * ~/tmp/job1.sh
*/5 * * * * ~/tmp/job2.sh

可以看到上面有job1.sh和job2.sh两个作业,其效果相当于将jobs.cron文件的内容拷贝进去。

如果想要删除作业,则执行:

# crontab -r

这样会删除所有作业,如果只想删除一个,或者想对作业进行编辑,可以使用下面的命令。

2.4 编辑定时任务

crontab -e 命令会调用编辑器(通常是vi或者vim),直接编辑计划作业,相当于编辑jobs.cron。只不过编辑完立即生效,不需要再执行crontab进行加载。

# crontab -e
crontab: installing new crontab

统一期间,个人不建议使用crontab -e编辑计划,而是编辑jobs.cron,然后进行加载。这样的话jobs.cron文件相当于一个备份,方便日后恢复。

3. 查看作业日志

在作业执行出现异常(或作业脚本写日志)时,cron服务会输出日志,在我的CentOS7系统上,查看的地址位于/var/log下。

# ls /var/log | grep cron
cron
cron-20180819
cron-20180826
cron-20180902
cron-20180909

如果想让自己编写的作业输出日志,可以这样编写jobs.cron:

* * * * * ~/tmp/job1.sh >> /var/log/job1.log 2>&1

上面的意思是将stdout和stderr输出到/var/log/job1.log。

修改job1.sh,在底部加入echo hello。然后调用crontab jobs.cron重新加载,然后在/var/log目录下可以看到job1.log,其中包含了输出的文本“hello”。

至此,我们已经熟悉了cron相关的概念,并完成了常见的添加、删除、编辑操作,且学会了如何查看和输出作业日志。

转载:http://www.tracefact.net/tech/080.html----------END----------

6197882a00bbddb9032280d0dacb784c.png

相关文章:

Bootstrap学习记录-2.container和table

1. Container Bootstrap中容器类提供了2个类标识:container、container-fluid。 两者的区别在于:container:容器不止有15px的padding,还有一个随着浏览器宽度变化而变化的margin。container-fluid:只有固定的15px的pad…

java中super用来定义父类,Java中super的几种用法及与this的区别

综观目前的 Web 应用,多数应用都具备任务调度的功能。本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺点进行比较,目的在于给需要开发任务调度的程序员提供有…

1001 A+B

代码链接 PDF链接 首先要说的是这道题的难点是如何把数字输出加入逗号,毕竟数据范围并没有超过Long。当然这个难点也不是问题,将数字转为字符串,C中就有这样的函数,然后再用 %30 这样来控制输出 。 但我最近出于想要建立自己的代码库的想法&a…

pma mysql_Table ‘phpmyadmin.pma_table_uiprefs’ doesn’t exist mysql

Error: #1146 – Table ‘phpmyadmin.pma_table_uiprefs’ doesn’t exist mysqlJust upgrade my ubuntu 14 to 15. all looks good then i go to my localhost phpmyadmin and tried to open database then found a strange error like mysql said: #1146 – Table ‘phpmyadm…

Qt字符编码,创建中文文件

1.代码文件本身编码; 2.Qt中用于控制读入和写出文件系统时的字符编码由QTextCodec::setCodecForLocale()所决定。一般不用设置,Qt跟系统交互时会根据系统的Locale来更改传给系统的参数的编码; //utf8格式 QString str1("你好Hello\r\…

Python 查看本机WiFi密码

http://www.lijiejie.com/python-get-all-saved-wifi-passwords/ 很早以前我写过一个,丢了。 今天偶然看到这篇文章 , 也是很久以前写的,他用的方法太烦了。 dos命令不是可以取本机WiFi密码吗。 #coding:utf-8 import os import re impor…

五连阳回调买入法_“4连阳+1阴”这种股票,吃透主升浪!挣得万贯家财

根据以往的个股表现情况来看,那些即将进入主升浪的个股具有以下几个特点:1、个股前期已经有了一定的涨幅,但向上的步伐比较谨慎,走势比较温和;2、股价所处的位置并不低,有的是一段时期以来的最高位置,有的甚…

java有模糊查询吗,到底Java里的模糊查询语句该怎么写

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼现在String sql"select * from car where carName like %?%";可以查询出结果了,但问题又来了,只能查询出一条结果,代码如下carDao.java页面public ArrayList queryAppoint(String car…

stm32的rxne和idle中断_HAL库的STM32F767的DMA通过IDLE中断接收数据但不能访问

仿真能看到接收缓冲区数组中的数据,但不能访问,如果不访问,再开启DMA接收能正常接收,并且在仿真状态下也能查看。只要访问一次这个数组,下一次开启DMA接收后就不能接收数据了。原代码如下:if(rx_end 1){rx…

使用OpenRowSet操作Excel Excel导入数据库

使用 OpenRowSet 和 OpenDataSource 访问 Excel 97-2007 测试文件:D:\97-2003.xls和D:\2007.xlsx,两个文件的内容是一模一样的。 测试环境:SQL Server 2000 / 2005。 ---------------------------------------------------------------------…

在Windows上搭建Git Server

Git在版本控制方面,相比与SVN有更多的灵活性,对于开源的项目,我们可以托管到Github上面,非常方便,但是闭源的项目就会收取昂贵的费用。 那么私有项目,如何用Git进行代码版本控制呢?我们可以自己…

pci串口驱动安装失败_TSC TTP-243E Pluse装LTP并口驱动无法安装

一、前言描述接到客户报修说,电脑无法开机,即到哥上门维修立即安排人员到现场查看原因,到现场后,查看的确是电脑系统问题,重新安装系统,安装完成系统后,发现打印机无法使用。这个打印机型号是TS…

PHP中阶,PHP进阶

PHP功能的强大首先在于它的大量的内置函数库,它可以让初学者也能执行许多复杂的任务,而不必安装新的库和关心底层的详细情况,而这恰恰是其它流行的诸如Perl这样的客户端语言所不具备的。由于这个教程的限制,我们仅仅学习了一些与M…

安卓手机格式化怎么弄_安卓手机无法启动如何进行格式化

当我们在使用安卓智能手机的时候,由于使用错误或者出现的各种问题导致手机无法重启,相信你一定会感到很烦恼!而如果手机混乱到无法启动,格式化是一个不错的尝试方法!下面给大家介绍手机格式化的方法和注意事项&#xf…

位域 内存 字节序_JS操作内存?二进制数组了解一下

二进制数组的由来主要是为了提高浏览器与显卡之间的通信效率,由二进制数据代替传统的文本。二进制数组主要有三个对象:ArrayBufferTypedArrayDataViewArrayBuffer对象ArrayBuffer是一个构造函数,参数是一个数字,代表索取多少个字节…

求排列的逆序数(分治)

考虑1,2,…,n (n < 100000)的排列i1&#xff0c;i2&#xff0c;…&#xff0c;in&#xff0c;如果其中存在j,k&#xff0c;满足 j < k 且 ij > ik&#xff0c; 那么就称(ij,ik)是这个排列的一个逆序。 一个排列含有逆序的个数称为这个排列的逆序数。例如排列 263451 含…

mysql 查看当前事务id,MySQL 如何查询当前最新事务ID

写在前面&#xff1a;在个别时候可能需要查看当前最新的事务 ID&#xff0c;以便做一些业务逻辑上的判断(例如利用事务 ID 变化以及前后时差&#xff0c;统计每次事务的响应时长等用途)。通常地&#xff0c;我们有两种方法可以查看当前的事务 ID&#xff1a;1、执行 SHOW ENGIN…

password

pwdText wx.TextCtrl(panel, -1, ”password”, size(175, -1), stylewx.TE_PASSWORD)转载于:https://www.cnblogs.com/chengxuyuan326260/p/6364695.html

java 自带thread分析工具_java自带的jvm分析工具

这段时间觉得很有必要对java的内存分析工具进行熟悉&#xff0c;这样以后出现机器负载较高&#xff0c;或者反应很慢的时候&#xff0c;我就可以查找原因了。上网搜了搜&#xff0c;发现下面这些是比较常用的&#xff0c;然后我在机器上试试了&#xff0c;把结果也贴出来哈。1.…

Python笔记:字典的fromkeys方法创建的初始value同内存地址问题

dict中的fromkeys()函数可以通过一个list来创建一个用同一初始value的dict。 1 d dict.fromkeys(["苹果", "菠萝"], [apple, pineapple]) 2 print(d) 3 d.get("苹果").append(orange) 4 print(d){苹果: [apple, pineapple], 菠萝: [apple, pine…

表格下划线怎么加粗_这招高!Excel签名栏的下划线随列宽变化,是不是感觉牛哄哄的?...

职场牛人的世界总有各种高招&#xff0c;随手蹦出&#xff0c;令人赞叹不已&#xff01;今天早上去填一个表格&#xff0c;在输入签名时&#xff0c;突然发现签名处的下划线是随着列宽的变化而自动变化&#xff0c;这绝对是动态的&#xff0c;这是怎么做到的呢&#xff1f;我特…

JS高级程序设计拾遗

《JavaScript高级程序设计&#xff08;第三版&#xff09;》反反复复看了好多遍了&#xff0c;这次复习作为2017年上半年的最后一次&#xff0c;将所有模糊的、记不清的地方记录下来&#xff0c;方便以后巩固。 0. <script>元素属性 async表示立即下载脚本&#xff0c;但…

mysql建立高效索引,如何知道你建立的MySQL索引是高效,合理的

不管是开发人员&#xff0c;仍是数据库维护人员&#xff0c;给表建立索引是很常见的事情。普通到什么程度&#xff0c;初级&#xff0c;中级开发人员的印象中&#xff0c;只要写的sql语句效率不高&#xff0c;第一反应就是建索引&#xff0c;而无论这个字段是否适合建立索引。反…

32位java 最大内存_【答疑系列】为什么32位系统只支持最大4G内存?

这个问题一直都有同学问到&#xff0c;算是提问次数最多的问题之一了。32位是什么现在主流的操作系统都是64位的&#xff0c;早期存在32位操作系统&#xff0c;相信大家也都有所听闻&#xff0c;其实&#xff0c;在更早之前&#xff0c;还有16位、8位的&#xff0c;这里就不展开…

新手C#string类常用函数的学习2018.08.04

ToLower()用于将字符串变为小写&#xff0c;注意字符串的不可变特性&#xff0c;需要重新赋值给另一个字符串变量。 s s.ToLower();//字符串具有不可变性&#xff0c;转换后需要重新赋值&#xff0c;不可仅有s.ToLower(); 这可以使用户的输入不区分大小写&#xff0c;例如验证…

开始使用博客了,改变从这里开始。

开始使用博客了&#xff0c;改变从这里开始。 开始使用博客了&#xff0c;改变从这里开始。 开始使用博客了&#xff0c;改变从这里开始。转载于:https://www.cnblogs.com/hello001/p/6367259.html

php 贝瑟尔曲线,贝塞尔曲线的应用详解

简介贝塞尔曲线是可以做出很多复杂的效果来的&#xff0c;比如弹跳球的复杂动画效果&#xff0c;首先加速下降&#xff0c;停止&#xff0c;然后弹起时逐渐减速的效果。使用贝塞尔曲线常用的两个网址如下&#xff1a;缓动函数&#xff1a;cubic-bezier&#xff1a;如何用贝塞尔…

区别 eks_sport 和 exercise 有什么区别?看完你就清楚了!

说到“运动”sport 这个单词应该是不少人看到“运动”的第一反应吧sport /spɔ:t/ n.体育运动例如&#xff1a;Id say football is my favourite sport.我最喜欢的运动要数足球了。习语&#xff1a;be a sport 讲交情例如&#xff1a;Shes a good sport.她很讲交情。sport通常指…

java gps时间转换工具_java 时间戳和时间互转工具 和 时间偏移量计算

时间互转代码片段&#xff1a;* 时间戳 转 时间 ** param beginDate* return* see [类、类#方法、类#成员]*/public static String timeStampToTime(String beginDate){SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date new Date(Long…

tcp 状态转换.

命令行:rootubuntu:/home/linson# netstat -apt | grep 3030 server,listen 服务端根据端口生成一个socket.用于监听连接.也就是监听3次握手,当3次握手成功,建立一个连接接放入队列中. 也就是说执行了listen,会自动应答3次握手,如果不执行listen,没有api会帮你处理3次握手. 所以…