[转帖]Linux:crontab要点整理(表达式,转义,权限管理,日志)
https://www.jianshu.com/p/fd46652f247e
摘要:Linux
,crontab
整理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要点整理(表达式,转义,权限管理,日志)的更多相关文章
- Linux分类笔记(一)-权限管理
Linux分类笔记(一) 权限管理 普通权限 文件的普通权限 对一个普通的文件使用ls -ll命令后,看到下面的输出内容 而对于文件权限中的每一位,又分别代表了以下的意思 文件类型又有以下几类: ...
- Lambda 表达式应用 权限管理_用户的角色修改
Lambda 表达式应用 权限管理_用户的角色修改 需求 前台发送用户新的角色列表,后台查询出用户原有的角色列表. 1.获取出需增加的角色列表 => 在新角色列表中,但是不在原角色列表中的角色 ...
- [转帖]Linux crontab 查看所有用户的crontab任务
Linux crontab 查看所有用户的crontab任务 https://www.cnblogs.com/xzlive/p/11542176.html 查看所有用户的crontab任务 - mlz ...
- (大数据工程师学习路径)第一步 Linux 基础入门----用户及文件权限管理
用户及文件权限管理 实验介绍 1.Linux 中创建.删除用户,及用户组等操作. 2.Linux 中的文件权限设置. 一.Linux 用户管理 Linux 是一个可以实现多用户登陆的操作系统,比如“李 ...
- 【linux相识相知】用户及权限管理
linux系统是多用户(Multi-users)和多任务(Multi-tasks)的,这样的目的是为了一台linux主机可以给很多用户提供服务同时运行多种服务,但是我们是怎么区分每个用户呢?作为一个管 ...
- Linux命令(四)——文件权限管理
文件权限是指对文件的访问控制,即哪些用户或群组可以访问文件以及执行什么样的操作. 一.文件的权限 1.Linux文件类型 (1)普通文件:文本文件+数据文件+可执行的二进制文件. (2)目录文件:即文 ...
- Linux的用户与用户组(权限管理)
linux用户与用户.权限管理 用户管理: 1.useradd 创建用户 -c 指定用户描述 -d 指定家目录 默认家目录 /home下同名的目录 -g 指定主组 -G 指定附加组 [注意:一个用户主 ...
- Linux学习笔记(八)权限管理命令
权限管理命令 权限位含义 chmod chown chgrp umask默认权限 权限位含义 第1位代表文件类型 "-":普通文件 "b":块设备文件 &quo ...
- 键盘侠Linux教程(五)| 基本权限管理
基本权限管理 权限的介绍 权限位的含义 前面讲解ls命令时,我们已经知道长格式显示的第一列就是文件的权限,例如: [root@es ~]# ls -l anaconda-ks.cfg -rw----- ...
- Linux的VMWare中Centos7文件权限管理chown 和 chmod
文件管理 chown chmod 1./根目录下目录功能划分 /boot/ 存放系统启动程序菜单及核心 --可以单独使用文件系统 /etc/ 存放系统中所有配置文件 /bin/ ...
随机推荐
- 从C++CLI工程的依赖库引用问题看.Net加载程序集机制
问题 最近在为某第三方MFC项目写C++/CLI工程插件时遇到了如下一个问题: MFC的工程不允许把.Net的依赖程序集放到执行程序的目录(防止影响其稳定性),依赖库只能放到非执行程序子目录的其他目录 ...
- AI开发实践丨客流分析之未佩戴口罩识别
摘要:通过本教程,我们可以学习客流统计应用的扩展--过线客流统计+口罩佩戴识别,可用于商超.写字楼入口安检. 本文分享自华为云社区<客流分析之未佩戴口罩识别>,作者: HiLens_fei ...
- 网络知识一箩筐:IP地址划分的那些知识点
摘要:IP地址是怎么划分的呢?划分的依据是什么呢?本节小课将带你一起学习IP地址划分.子网划分.子网掩码.CIDR等网络基础概念,了解IP地址划分背后的那些故事. 首先,回忆一下,前面小课中我们有提到 ...
- Solon 开发进阶,三、常用配置说明
Solon 开发进阶 一.插件扩展机制 二.体外扩展机制 三.常用配置说明 四.启动参数说明 五.全局异常订阅 应用主配置文件为: resources/app.yml( 或 app.propertie ...
- module 'numpy' has no attribute 'int'.
原因:np.int 在 NumPy 1.20 中已弃用,在 NumPy 1.24 中已删除 AttributeError: module 'numpy' has no attribute 'int'. ...
- AC(AtCoder) Library 文档翻译
AC(AtCoder) Library Document下载使用 如何安装 首先在 Github 上找到 ac-library 仓库.下载最新版本 解压 zip 文件后将 atcoder ,放置GCC ...
- 如何在Windows中使用Telnet客户端
Telnet协议的解释 Telnet( TE终端NET工作的缩写)是一种网络协议,用于提供与设备通信的命令行界面 . Telnet最常用于远程管理,但有时也用于某些设备的初始设置,尤其是交换机 ,接入 ...
- OKR之剑·实战篇05:OKR致胜法宝-氛围&业绩双轮驱动(上)
作者:vivo 互联网平台产品研发团队 本文是<OKR 之剑>系列之实战第 5 篇-- 我们的OKR执行如此顺利,离不开我们的"双轮驱动".类似于亚马逊的"飞 ...
- ifelse优化方案
优化 if else:https://blog.csdn.net/FBB360JAVA/article/details/103832405 利用java8特性优化: https://blog.csdn ...
- SAE 2.0,让容器化应用开发更简单
云原生容器化应用托管模式的演变 云原生这个概念从提出,到壮大,再到今天的极大普及,始终处于一个不断演进和革新的过程中.云原生体系下应用的托管形态是随着企业应用架构在不断演进的.最早的应用大多是集中式. ...