linux 定时任务(crontab)
简介
crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务
命令格式
命令格式:crontab [-u username] [-l|-e|-r]
参数:
-u
: 只有root才能进行这个任务,也即帮其他用户新建/删除crontab工作调度;-e
: 编辑crontab 的工作内容;-l
: 查阅crontab的工作内容;-r
: 删除所有的crontab的工作内容,若仅要删除一项,请用-e去编辑
查看帮助文档
如果使用 crontab -h
会报错,但也会输出一个简写的帮助文档
正确的查看帮助文档的方法是使用
man crontab
系统的计划任务放在
/etc/crontab
,并且里面有计划参数的解析注释 <分钟> <小时> <当月的第几日> <月> <每周的第几天> <定时执行的命令>
代表意义 | 分钟 | 小时 | 日期 | 月份 | 周 | 命令 |
---|---|---|---|---|---|---|
数字范围 | 0~59 | 0~23 | 1~31 | 1~12 | 0~7 | 命令 |
周的数字为0或7时,都代表“星期天”的意思。另外,还有一些辅助的字符,大概有下面这些:
特殊字符 | 代表意义 |
---|---|
*(星号) | 代表任何时刻都接受的意思。举例来说,范例一内那个日、月、周都是*,就代表着不论何月、何日的礼拜几的12:00都执行后续命令的意思。 |
,(逗号) | 代表分隔时段的意思。举例来说,如果要执行的工作是3:00与6:00时,就会是:0 3,6 * * * command 时间还是有五列,不过第二列是 3,6 ,代表3与6都适用 |
-(减号) | 代表一段时间范围内,举例来说,8点到12点之间的每小时的20分都进行一项工作:20 8-12 * * * command仔细看到第二列变成8-12.代表 8,9,10,11,12 都适用的意思 |
/n(斜线) | 那个n代表数字,即是每隔n单位间隔的意思,例如每五分钟进行一次,则:/5 * * * * command 用与/5来搭配,也可以写成0-59/5,意思相同 |
编写定时任务
crontab的环境变量在 /etc/crontab
中,与我们系统的环境变量不同,因此所有文件都要用绝对路径。用相对路径不能正常执行。
下面以每分钟执行一次为例
定时执行计划
cron.crontab
* * * * * echo `date '+\%F \%T' > /home/chen/output.txt`
定时执行脚本
不包含变量
shell1.crontab
*/1 * * * * /home/chen/test1.sh`
test1.sh
#!/bin/bash
#!/bin/bash
echo test >> /home/chen/output.txt
包含变量
shell2.crontab
*/1 * * * * /home/chen/test1.sh >> /home/chen/output.txt
test2.sh
#!/bin/bash
start_time=`date -d '-1 minute' '+%F %T'`
end_time=`date '+%F %T'`
echo ${start_time} ${end_time}
定时执行python脚本
python控制台重定向到文件
py1.crontab
* * * * * /usr/bin/python home/chen/print.py >> /home/chen/output.txt
print.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-import datetimenow_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
before_time = (datetime.datetime.now()+datetime.timedelta(minutes=-1)).strftime("%Y-%m-%d %H:%M:%S");
print before_time, now_time
python直接写入文件
py2.crontab
* * * * * python home/chen/file.py
file.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-import datetimenow_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
before_time = (datetime.datetime.now()+datetime.timedelta(minutes=-1)).strftime("%Y-%m-%d %H:%M:%S");
#print before_time, now_time
f = open('/home/chen/output.txt', 'a');
f.write(before_time + ' &' + now_time + '\n')
f.close();
常用命令
- 执行定时任务
crontab <脚本路径>
命令执行计划,例如crontab task1.crontab
- 列出当前任务
cronta -l
- 编辑当前任务
crontab -e
- 删除所有任务
crontab -r
注意事项
- 在自定义的
crontab 文件
和crontab -e
的定时任务编辑器中,可以定义变量 - 统一时刻,只能执行一个定时任务。当运行新的任务时,之前的任务会被自动取消
- 定时计划可以用批处理文件,例如:
* * * * * <批处理文件的完整路径>
。一定要用完整路径,而非相对路径!!! - 定时任务的百分号
%
前面一定要加一个转义符号\
,如果不加会被当做换行符,而不是命令 - 任务计划中可以定义变量
<变量名>=<变量值>
。但是“变量值”只能是常量,不能引用其他变量。例如end_time=${date '+%F %T'}
会被当做字符串原样输出,无法达到预期效果。如果要定义这种变量,建议换至shell文件中。 - 如果定时任务没有任何反应,一定是计划文件中的语法有误
- 由于定时任务都是在后台执行的,因此没有回显,可以通过重定向到文件,判断其是否执行成功。另外,通过
tail -f <文件绝对路径>
持续输出
查看日志
编辑配置文件 sudo vim /etc/rsyslog.d/50-default.conf
将cron前面的注释符去掉 cron.* /var/log/cron.log
。
保存文件时用 : w ! sudo tee %
tee 用于读取输入文件,同时保存。%表示当前编辑文件。
注意:该方法要求当前编辑用户必须在 sudoers这个文件中,这也是执行sudo命令的要求。
之后重启 rsyslog 和 cron
sudo service rsyslog restart
sudo service cron restart
后面执行 cat /var/log/cron.log
即可查看后续日志了
查看日志可以发现,每当启用一个定时任务,之前的就被替换了(即同一时刻只能存在一个定时任务)
发现报错:
(CRON) info (No MTA installed, discarding output)
原因有两个:
- 命令中含有shell指令
- 执行任务过程中会往屏幕输出内容
报错原因:报错的主要原因是没有配置邮件服务器
解决办法:安装并重新配置邮件服务器
sudo apt-get install postfix
sudo dpkg-reconfigure postfix
MAIL (mailed 26 bytes of output but got status 0x004b from MTA#012)
查看日志 tail -f /var/log/cron.log
,发现报错
由于是邮件错误,因此查看邮件日志
tail /var/log/mail.log
。错误如下:fatal: open /etc/postfix/main.cf: No such file or directory
执行
sudo dpkg-reconfigure postfix
命令,在配置项里面选择除了第1项以外的(我是选第2项)
linux 定时任务(crontab)相关推荐
- [老男孩笔记系列]-之linux定时任务crontab命令详解
linux定时任务crontab命令详解 1.1指令语法 crontab [ -u user ] file crontab [ -u user ] { -l | -r | -e } 1.2指令说明 通 ...
- linux定时任务crontab的设置
linux定时任务crontab的设置 http://www.blogjava.net/freeman1984/archive/2010/09/23/332715.html vi /etc/cront ...
- linux cron 服务,Linux定时任务Crontab详解(推荐)
今天做了个数据库的备份脚本,顺便系统得学习一下linux下定时执行脚本的设置.Linux下的定时执行主要是使用crontab文件中加入定制计划来执行,设置比Windows稍微复杂一些(因为没有图形界面 ...
- linux下crontab命令的用法,linux 定时任务crontab用法详解
linux 定时任务crontab用法详解 linux中crontab命令用于设置周期性被执行的指令,该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读 ...
- linux定时任务crontab添加,linux定时任务crontab使用方法
linux定时任务crontab使用方法 Linux下的任务调度分为两类,系统任务调度和用户任务调度. 在/etc/crontab文件,这个就是系统任务调度的配置文件.用户任务调度的定时任务文件保存在 ...
- linux no mail for root,Linux定时任务Crontab使用 提示no crontab for root
使用命令查询crontab 任务时,一直提示:no crontab for root .查看了一些资料,说是crontab在初始时,设置了一次编辑方式,所以试了一下crontab -e的方式编辑,即在 ...
- linux c语言定时任务crontab,linux 定时任务 crontab相关(一)
情况一:正常情况(系统有service命令) 重启服务命令:[root@centos6 /]# service crond restart 启动服务命令:[root@centos6 /]# servi ...
- linux crontab怎么写,linux定时任务crontab
利用linux的定时任务crontab来执行脚本,在centos7版本下运行 1.安装crontab yum install crontab 2.查看状态及关闭和启动任务 查看状态:systemctl ...
- Linux定时任务 crontab(-l -e)、at、batch
1.周期性定时任务crontab cron['krɒn] 一时间单位 table crontab -e 进入编辑定时任务界面,每一行代表一个定时任务,#开头的行为注释行,一行分成6列 分钟 小时 日 ...
- linux半夜三点半定时重启,linux 定时任务 crontab相关(三)
crontab -l 表示列出所有的定时任务 crontab -r 表示删除用户的定时任务,当执行此命令后,所有用户下面的定时任务会被删除,执行crontab -l后会提示用户:"no cr ...
最新文章
- java esc的_如何用Java中的Receipt打印机和ESC / POS命令提高速度
- jdk 安装cmd运行java_windows下安装jdk,cmd下编译运行java程序一点心得
- 27. Location reload() 方法
- 一步一步安装 Windows Server 2008 Beta3(Code Name Longhorn)
- a0图框标题栏尺寸_a0图纸尺寸(a0图纸标题栏尺寸标准国标)
- win10内置ubuntu, “指定的网络名不再可用”解决办法
- Arm 虚拟硬件与新解决方案或将颠覆物联网产品研发
- 【kali技巧】查看宿主机windows的ip地址
- PYTHON实践——GUI界面
- 无分类编址(超网)中的网络前缀
- 为什么现在我们很难打造一支跟中供铁军一样的销售队伍?
- 小心!除了植入木马,你的充电宝可能还在窃听你,受害人遍布全国
- 用python画价格—需求曲线图
- 基于粤嵌6818开发板上通过网络连接实现文件传输
- 购物以及退换流程图是什么?分享购物及退换货流程图模板
- linux开vnc,linux 开启 vnc
- 【移动终端应用开发】实验1:SharedPreferences的应用
- 数据质量分析之信息调研
- 2022年大二学生HTML期末作业,网页制作作业(我的校园网站制作)
- VS2010下ocx开发:(2)在C#程序中调用ocx控件