51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Linux使用定时任务(crontab)

简介 {#%E7%AE%80%E4%BB%8B}

在服务端,我们可能会对linux进行简单的监控或者定期执行一些操作,因此会用到linux自带的定时任务功能(crontab)

安装 {#%E5%AE%89%E8%A3%85}

默认Linux系统内置cron,如果没有的话,就安装一下

apt install vixie-cron
apt install crontabs

可以通过 service --status-all 看到,在Ubuntu/Debian中, cron 是一个service,可以用 service 命令来操作,如:

service cron start		# 启动
service cron stop		#停止服务
service cron restart	#重启加载
service cron reload		#重新加载
service cron status		# 查看状态

语法 {#%E8%AF%AD%E6%B3%95}

man {#man}

Usage:
 crontab [options] file
 crontab [options]
 crontab -n [hostname]
`Options:
-u <user>  define user
-e         edit user's crontab
-l         list user's crontab
-r         delete user's crontab
-i         prompt before deleting
-n <host>  set host in cluster to run users' crontabs
-c         get host in cluster to run users' crontabs
-s         selinux context
-x <mask>  enable debugging
`

1. 查看定时任务 {#1.-%E6%9F%A5%E7%9C%8B%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1}

1)查看当前用户的 {#1)%E6%9F%A5%E7%9C%8B%E5%BD%93%E5%89%8D%E7%94%A8%E6%88%B7%E7%9A%84}

crontab -l 

2)查看指定用户的 {#2)%E6%9F%A5%E7%9C%8B%E6%8C%87%E5%AE%9A%E7%94%A8%E6%88%B7%E7%9A%84}

crontab -l  -u xxx       # xxx

查看指定用户(xxx)正在执行的任务 ,只需要添加-u参数即可,其他命令也同理

3)查看系统所有用户的 {#3)%E6%9F%A5%E7%9C%8B%E7%B3%BB%E7%BB%9F%E6%89%80%E6%9C%89%E7%94%A8%E6%88%B7%E7%9A%84}

cat /etc/passwd |cut -f 1 -d : |xargs -I {} crontab -l -u {}

2. 删除当前的定时任务 {#2.-%E5%88%A0%E9%99%A4%E5%BD%93%E5%89%8D%E7%9A%84%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1}

crontab -r 

3. 新增或编辑定时任务 {#3.-%E6%96%B0%E5%A2%9E%E6%88%96%E7%BC%96%E8%BE%91%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1}

crontab -e

进入编辑模式, 按照指定任务命令格式编辑命令, 格式参照下面的任务命令格式

4. 查看支持的环境变量 {#4.-%E6%9F%A5%E7%9C%8B%E6%94%AF%E6%8C%81%E7%9A%84%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F}

cat /etc/crontab
`SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root      #发送邮件到账号
`

任务命令格式 {#%E4%BB%BB%E5%8A%A1%E5%91%BD%E4%BB%A4%E6%A0%BC%E5%BC%8F}

任务命令分为两个部分: 第一部分是cron表达是, 后面跟着sh命令

例子

* * * * *  /root/date.sh   # 每分钟执行一次date.sh脚本文件
0 * * * * echo '-------------' >> /root/date.txt   # 每小时0分的时候向date.txt文件中加入一句话
* 1 * * 0 rm -rf /root/date   #每个星期的星期天的1点左右删除date文件

cron表达式的语法规则 {#cron%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%9A%84%E8%AF%AD%E6%B3%95%E8%A7%84%E5%88%99}

*    *    *    *    *
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 星期中星期几 (0 - 6) (星期天 为0)
|    |    |    +---------- 月份 (1 - 12) 
|    |    +--------------- 一个月中的第几天 (1 - 31)
|    +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)

sh命令语法规则 {#sh%E5%91%BD%E4%BB%A4%E8%AF%AD%E6%B3%95%E8%A7%84%E5%88%99}

单行的可执行的sh命令, 可以是运行shell脚本的命令,也可以是直接的sh命令

其他 {#%E5%85%B6%E4%BB%96}

1) 任务是否执行查询 {#1)-%E4%BB%BB%E5%8A%A1%E6%98%AF%E5%90%A6%E6%89%A7%E8%A1%8C%E6%9F%A5%E8%AF%A2}

/var/log/目录下有cron开头的文件, 里面包含了crontabs的执行记录

Feb 19 10:19:01 zdc CROND[8314]: (root) CMD (/root/date.sh)
Feb 19 10:20:01 zdc CROND[8390]: (root) CMD (/root/date.sh)
Feb 19 10:21:01 zdc CROND[8440]: (root) CMD (/root/date.sh)
Feb 19 10:22:01 zdc CROND[8487]: (root) CMD (/root/date.sh)
Feb 19 10:23:01 zdc CROND[8544]: (root) CMD (/root/date.sh)

推荐将任务写成脚本, 在其中添加执行成功失败之类的输出逻辑,自定义输出到指定文件中 如

...业务逻辑
echo "成功"  >> /root/date.info

2) 任务是否出错判断 {#2)-%E4%BB%BB%E5%8A%A1%E6%98%AF%E5%90%A6%E5%87%BA%E9%94%99%E5%88%A4%E6%96%AD}

当任务执行过程中报错后,会给当前用户发送邮件,默认情况下在/var/spool/mail 中的对应用户文件下

您在 /var/spool/mail/root 中有新邮件
...
X-Cron-Env: <XDG_SESSION_ID=4303>
X-Cron-Env: <XDG_RUNTIME_DIR=/run/user/0>
X-Cron-Env: <LANG=zh_CN.UTF-8>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>
Message-Id: <20210222015652.48902109F2CC@mail.qq.com>
Date: Fri, 19 Feb 2021 10:31:02 +0800 (CST)
`/root/date.sh:行3: success: 未找到命令
`

赞(2)
未经允许不得转载:工具盒子 » Linux使用定时任务(crontab)