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~590~231~311~120~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 datetime

now_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 datetime

now_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

注意事项

  1. 在自定义的 crontab 文件crontab -e 的定时任务编辑器中,可以定义变量
  2. 统一时刻,只能执行一个定时任务。当运行新的任务时,之前的任务会被自动取消
  3. 定时计划可以用批处理文件,例如:* * * * * <批处理文件的完整路径>。一定要用完整路径,而非相对路径!!!
  4. 定时任务的百分号%前面一定要加一个转义符号\,如果不加会被当做换行符,而不是命令
  5. 任务计划中可以定义变量<变量名>=<变量值>。但是“变量值”只能是常量,不能引用其他变量。例如end_time=${date '+%F %T'} 会被当做字符串原样输出,无法达到预期效果。如果要定义这种变量,建议换至shell文件中。
  6. 如果定时任务没有任何反应,一定是计划文件中的语法有误
  7. 由于定时任务都是在后台执行的,因此没有回显,可以通过重定向到文件,判断其是否执行成功。另外,通过 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)

原因有两个:

  1. 命令中含有shell指令
  2. 执行任务过程中会往屏幕输出内容

报错原因:报错的主要原因是没有配置邮件服务器

解决办法:安装并重新配置邮件服务器

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项)
在这里插入图片描述

### 使用 `crontab` 命令管理定时任务 #### 编辑用户的定时任务列表 编辑当前用户的定时任务可以通过 `-e` 参数实现。这会打开默认的文本编辑器来修改用户的 crontab 文件[^1]。 ```bash crontab -e ``` #### 列出用户的定时任务 查看当前用户已设定的所有定时任务可以使用 `-l` 参数[^2]。 ```bash crontab -l ``` #### 删除用户的定时任务 移除当前用户的全部定时任务可借助 `-r` 参数完成;如果希望删除前得到确认提示,则应加上 `-i` 选项[^3]。 ```bash crontab -r # 直接删除所有任务,不询问 crontab -ir # 提示是否真的要删除这些任务 ``` #### 替换用户的定时任务 当指定一个文件作为参数传递给 `crontab` 命令时,默认行为是用此文件的内容替换现有的 crontab 条目。例如: ```bash crontab my_tasks.txt ``` 这里假设 `my_tasks.txt` 是一个包含了有效 cron 表达式的纯文本文件[^4]。 #### 设置具体的定时任务表达式 为了定义何时以及如何执行某个特定的任务,在 crontab 文件里每行代表一条记录,格式如下所示: | 字段 | 含义 | |--|--------------------------------------------------| | minute | 每个小时中的哪一分钟 | | hour | 每日中的哪一个钟头 | | day of moth| 每月中具体某一天 | | month | 年份里的某一月份 | | day of week| 星期几 | 各字段允许使用的数值范围也已在表格中给出。通过组合不同的时间单位,能够精确控制任务触发的时间点。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值