https://www.jianshu.com/p/fd46652f247e

摘要:Linuxcrontab
整理crontab的使用,包括cron表达式,设置和删除任务,权限管理,查看日志

crontab简介

crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务

 

启动和关闭crontab服务

使用如下命令进行crontab服务的开启,关闭,重启,和状态查看

/etc/init.d/cron start
/etc/init.d/cron stop
/etc/init.d/cron restart
/etc/init.d/cron status

其中启动关闭需要root权限,所有用户可以查看状态例如

test@ubuntu:/etc/init.d$ /etc/init.d/cron status
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2021-09-18 15:31:17 CST; 1 weeks 2 days ago
Docs: man:cron(8)
Main PID: 953 (cron)
Tasks: 1 (limit: 4915)
CGroup: /system.slice/cron.service
└─953 /usr/sbin/cron -f

cron表达式

crontab通过设置cron表达式来让计算机识别如何定时调度任务,cron表达式的基本语法

* * * * * command

前五个*分别代表分钟小时当月第几日当年第几月周几,最后的command是要执行的任务语句,详情和取值范围见下图

 
(1)*的含义

其中* 代表所有值,比如以下代表在每年9月27日17点07分执行一个命令,不限制周几

07 17 27 09 * echo "2021-09-27 17:07:00" >> /tmp/cron.txt

可见crontab最小颗粒度是以分钟级别进行调度,最粗级别是月,不限制年,因此至少每年执行一次

(2)周几和日月冲突

在cron表达式中最后一个*代表周几,如果前面的*限死了日期,且周几这个位置不为*为一个给定值,必定可能和周几冲突,当发生冲突时两者为OR的关系,即如果时间满足指定的日期,或者时间满足指定的周几,都会执行任务,举个例子

13 17 27 09 3 echo "2021-09-27 17:13:00" >> /tmp/cron.txt
17 17 28 09 1 echo "2021-09-27 17:17:00" >> /tmp/cron.txt

当天为9月27日,星期一,以上两条语句都会被执行,一个在当天的17点13分,一个在当天的17点17分,在/tmp/cron.txt文件中会先后写入两条记录

test@ubuntu: less /tmp/cron.txt
2021-09-27 17:13:00
2021-09-27 17:13:00

当周几这个位置设置为*时,无需关注冲突问题,即不对周几做限制

(3)特殊符号

除此之外cron表达式支持一些特征符号配合阿拉伯数字来设置每个*,这样可以实现每隔从,到的逻辑,分别对应三种常用符号,/-,分别解释如下

  • ,:在某个选项下列出多个枚举值
  • /:设置每隔多少数字,比如在小时位上设置为*/3则每隔3小时运行
  • -:设置一个时间位从多少到多少范围内都执行,比如分钟设置1-3,则从第1分到第3分都执行,两边都是包含关系

分别举几个例子
(1)17点43分和44分执行任务

43,44 17 27 09 * echo "new" >> /tmp/cron.txt

(2)每隔2分钟执行任务

*/2 17 27 09 * echo "new" >> /tmp/cron.txt

(3)从52分带56分一直执行任务,一共执行5次

52-56 17 27 09 * echo "new" >> /tmp/cron.txt

常用的cron表达式

下面来整理一波常用的cron表达式

00 * * * * command   # 每小时定时跑一次,在整点跑
*/10 * * * * command # 每十分钟跑一次,在整分钟跑
00 00 * * 0 command # 每周跑一次,在星期天0点跑
00 00 01 * * command # 每月跑一次,在每个月1号0点跑

command中的转义

目前已知的需要转义的是百分号%,尤其是在使用日期命令date做日期格式化时,否则无法在crontab中运行,因为%是crontab中的一个有意义的符号,应该这样设置带有百分号的command例如

*/1 * * * * echo `date +'\%Y-\%m-\%d \%H:\%M:\%S'` >> /home/crontab/date.txt

如果不这样设置,也可以单独写在一个shell脚本中使用bash解释执行也能够正常运行


设置,查看,删除任务

(1)任务设置

在当前用户下使用crontab -e来编辑添加定时任务,第一次使用会显示no crontab for用户,然后选择一种编辑方式选择输入3回车,如果首次没有设置后期也可以在终端输入select-editor进行设置

test@ubuntu:~$ crontab -e
no crontab for test - using an empty one Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed

设置完成之后输入crontab -e进入,该方法进入的是当前用户的crontab界面,新起一行即可写入cron表达式进行设置,例如

# m h  dom mon dow   command
#*/1 * * * * bash /home/crontab/run.sh >>/var/log/cron.log 2>&1
*/1 * * * * echo `date +'\%Y-\%m-\%d \%H:\%M:\%S'` >> /home/crontab/date.txt

其中可以使用#注释掉某行,则该cron表达式不生效,编辑完成后输入wq!进行保存关闭

(2)任务删除

一种直接的方式是使用crontab -r,这种方法删除该用户下所有crontab任务,其他用户的任务不影响都不会被删除,慎用,如果只是要删除其中某一条任务,则直接进入编辑删除这一行即可

(3)任务查看

任务查看使用crontab -l命令,该命令可以查看当前用户的crontab任务


crontab权限管理

(1)root下给其他用户设置定时任务

一台linux机器上每个不同用户都有自己的crontab -e文件设置自己的定时任务,这些任务互不干涉运行在一台机器上,其中root用户可以在使用crontab -e的时候可以切换其他用户进行设定,比如

crontab -u test -e

以上语句是在root下给test用户设置定时任务,如果是普通用户则报错没有-u权限

test@ubuntu:~$ crontab -u test -e
must be privileged to use -u
(2)crontab -e和/etc/crontab区别

crontab -e是用户级别的,设置每个用户的自己的定时任务,/etc/crontab是系统级别的,设置系统例行的任务,/etc/crontab只有root用户有读写权限,普通用户只有读权限。
/etc/crontab相比于crontab -e多出环境变量的配置和用户名配置,由root用户统一给各个任务配置用户名,设置的环境变量对/etc/crontab下所有人任务生效,比如修改他的python的搜索路径为anaconda

SHELL=/bin/sh
PATH=/opt/anaconda3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

这个设置只对/etc/crontab有效,对crontab -e的每个用户设置的任务无效
/etc/crontab中设置系统例行的定时任务

# m h dom mon dow user  command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

表示分别在小时,每天,每周,每月定时执行系统任务,其中test -x /usr/sbin/anacron代表条件测试文件是否可执行,如果可执行忽略||后面的命令内容,这种情况下系统走anacron,会读取/etc/anacrontab下的内容进行替代

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root # These replace cron's entries
1 5 cron.daily run-parts --report /etc/cron.daily
7 10 cron.weekly run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly run-parts --report /etc/cron.monthly

可见机器调用run-parts命令和/etc/cron.daily/etc/cron.weekly/etc/cron.monthly执行定时任务

(3)查看所有用户设置的任务

既然linux支持不同用户设置自己的任务,则在一个地方/var/spool/cron/crontabs看到所有用户设置的任务,这个目录只有root有权限进入

root@ubuntu:~/crontab# cd /var/spool/cron/crontabs
root@ubuntu:/var/spool/cron/crontabs# ls
test2 root test

目录下有三个文件,对应三个用户,root用户对这些文件可读可写,相当于跟crontab -e可以在这设置和修改任务,直接在里面编辑等同于切到某用户执行crontab -e


查看crontab日志

ubuntu下crontab默认没有日志文件,需要在配置中设置日志文件位置,配置文件位于/etc/rsyslog.d/50-default.conf将这一行注释取消

cron.*                          /var/log/cron.log

设置后重启rsyslog服务

sudo  service rsyslog  restart

下面看下一crontab日志的格式

test@ubuntu:~/crontab$ cat /var/log/cron.log
Sep 28 10:50:01 ubuntu CRON[1323]: (test) CMD (echo `date +)
Sep 28 10:50:01 ubuntu CRON[1322]: (CRON) info (No MTA installed, discarding output)
Sep 28 10:51:47 ubuntu crontab[4480]: (test) BEGIN EDIT (test)
Sep 28 10:52:19 ubuntu crontab[4480]: (test) END EDIT (test)
Sep 28 10:52:54 ubuntu crontab[6080]: (test) BEGIN EDIT (test)
Sep 28 10:53:15 ubuntu crontab[6080]: (test) REPLACE (test)
Sep 28 10:53:15 ubuntu crontab[6080]: (test) END EDIT (test)
Sep 28 10:54:01 ubuntu cron[953]: (test) RELOAD (crontabs/test)
Sep 28 10:50:01 ubuntu CRON[1323]: (root) CMD (echo `date +)

日志中包括执行时间主机名用户,以及执行的任务信息,任务信息包括执行的用户cron的command以及设置编辑crontab的记录,表明在哪个时间执行了哪个用户哪个命令语句
其中这两行反应了报错信息

Sep 28 10:50:01 ubuntu CRON[1323]: (test) CMD (echo `date +)
Sep 28 10:50:01 ubuntu CRON[1322]: (CRON) info (No MTA installed, discarding output)

crontab执行脚本时是不会直接错误的信息输出,而是会以邮件的形式发送到你的邮箱里,这时候就需要邮件服务器了,如果你没有安装邮件服务器,它就会报这个错:No MTA installed, discarding output,解决方案是将错误内容写入文件,比如在command后面添加>>/var/log/cron.log 2>&1追加,如果是>就是覆盖了,则crontab历史日志每次都会被删除,例如

*/1 * * * * bash /home/crontab/run.sh  >>/var/log/cron.log 2>&1

或者就写入其他目录下

[转帖]Linux:crontab要点整理(表达式,转义,权限管理,日志)的更多相关文章

  1. Linux分类笔记(一)-权限管理

    Linux分类笔记(一) 权限管理 普通权限 文件的普通权限 对一个普通的文件使用ls -ll命令后,看到下面的输出内容   而对于文件权限中的每一位,又分别代表了以下的意思 文件类型又有以下几类: ...

  2. Lambda 表达式应用 权限管理_用户的角色修改

    Lambda 表达式应用 权限管理_用户的角色修改 需求 前台发送用户新的角色列表,后台查询出用户原有的角色列表. 1.获取出需增加的角色列表 => 在新角色列表中,但是不在原角色列表中的角色 ...

  3. [转帖]Linux crontab 查看所有用户的crontab任务

    Linux crontab 查看所有用户的crontab任务 https://www.cnblogs.com/xzlive/p/11542176.html 查看所有用户的crontab任务 - mlz ...

  4. (大数据工程师学习路径)第一步 Linux 基础入门----用户及文件权限管理

    用户及文件权限管理 实验介绍 1.Linux 中创建.删除用户,及用户组等操作. 2.Linux 中的文件权限设置. 一.Linux 用户管理 Linux 是一个可以实现多用户登陆的操作系统,比如“李 ...

  5. 【linux相识相知】用户及权限管理

    linux系统是多用户(Multi-users)和多任务(Multi-tasks)的,这样的目的是为了一台linux主机可以给很多用户提供服务同时运行多种服务,但是我们是怎么区分每个用户呢?作为一个管 ...

  6. Linux命令(四)——文件权限管理

    文件权限是指对文件的访问控制,即哪些用户或群组可以访问文件以及执行什么样的操作. 一.文件的权限 1.Linux文件类型 (1)普通文件:文本文件+数据文件+可执行的二进制文件. (2)目录文件:即文 ...

  7. Linux的用户与用户组(权限管理)

    linux用户与用户.权限管理 用户管理: 1.useradd 创建用户 -c 指定用户描述 -d 指定家目录 默认家目录 /home下同名的目录 -g 指定主组 -G 指定附加组 [注意:一个用户主 ...

  8. Linux学习笔记(八)权限管理命令

    权限管理命令 权限位含义 chmod chown chgrp umask默认权限 权限位含义 第1位代表文件类型 "-":普通文件 "b":块设备文件 &quo ...

  9. 键盘侠Linux教程(五)| 基本权限管理

    基本权限管理 权限的介绍 权限位的含义 前面讲解ls命令时,我们已经知道长格式显示的第一列就是文件的权限,例如: [root@es ~]# ls -l anaconda-ks.cfg -rw----- ...

  10. Linux的VMWare中Centos7文件权限管理chown 和 chmod

    文件管理 chown  chmod 1./根目录下目录功能划分 /boot/  存放系统启动程序菜单及核心   --可以单独使用文件系统     /etc/   存放系统中所有配置文件 /bin/   ...

随机推荐

  1. Ubuntu 23.04、22.04、20.04、18.04替换国内源

    Ubuntu配置国内源 配置步骤如下: 1.Ubuntu配置文件位置:/etc/apt/sources.list 2.需要用root权限进入: sudo vi /etc/apt/sources.lis ...

  2. 盘点Python 中字符串的常用操作

    摘要:盘点 Python 中字符串的几个常用操作,对新手极度的友好. 本文分享自华为云社区<盘点 Python 中字符串的常用操作,对新手极度友好>,作者:TT-千叶 . 在 Python ...

  3. 跟我学丨如何用鲲鹏服务器搭建Hadoop全分布式集群

    摘要:今天教大家如何利用鲲鹏服务器搭建Hadoop全分布式集群,动起来··· 一.Hadoop常见的三种运行模式 1.单机模式(独立模式)(Local或Standalone Mode) 默认情况下Ha ...

  4. 手把手教你在 Windows 环境中搭建 MQTT 服务器

    前言 前些天要对接一家硬件商的设备数据,对方使用的 MQTT 协议点对点透传,所以又赶紧搭建 MQTT 服务器,写 .NET 程序接收数据等等,今天分享一下如何搭建 MQTT 服务器. MQTT 协议 ...

  5. 【Git】git多分支开发 git远程仓库 ssh链接远程仓库 协同开发 冲突解决 线上分支合并 pycharm操作git 远程仓库回滚

    目录 昨日回顾 1 git多分支开发 分支操作 合并分支 2 git远程仓库 2.1 把路飞项目传到远程仓库(非空的) 3 ssh链接远程仓库,协同开发 4 协同开发 5 冲突解决 5.1 多人同一分 ...

  6. shell 里使用 sed awk

    1 在shell脚本里使用sed 需把''改为"" 2 在shell脚本里使用awk 正则里使用 变量加上单引 awk -F: '/^'$user_name'/{print $1, ...

  7. 【HZERO】值集翻译

    值集翻译 值集管理: https://open.hand-china.com/document-center/doc/component/163/16090?doc_id=156008&doc ...

  8. 给科研人的 ML 开源发布工具包

    什么是开源发布工具包? 恭喜你的论文成功发表,这是一个巨大的成就!你的研究成果将为学界做出贡献. 其实除了发表论文之外,你还可以通过发布研究的其他部分,如代码.数据集.模型等,来增加研究的可见度和采用 ...

  9. JavaScript 基础 - Day01

    了解变量.数据类型.运算符等基础概念,能够实现数据类型的转换,结合四则运算体会如何编程. 体会现实世界中的事物与计算机的关系 理解什么是数据并知道数据的分类 理解变量存储数据的"容器&quo ...

  10. 汇编 | mov. add. sub指令

    Description 前面我们用到了mov, add. sub指令,它们都带有两个操作对象.到现在,我们知道,mov指令可以有以下几种形式. mov 寄存器,数据 比如: mov ax,8 mov ...