[转帖]Linux:crontab要点整理(表达式,转义,权限管理,日志)

linux,crontab,要点,整理,表达式,转义,权限,管理,日志 · 浏览次数 : 0

小编点评

#生成内容时带简单的排版 **1. 创建内容** ``` #内容内容 #此处添加任何需要的内容 #可以添加简单的排版 #例如: #内容包含一个标题 ##标题 #内容包含一个描述 ##描述 #内容包含多个标题和描述 ##标题和描述 #可以添加简单的排版 #例如: #内容包含一个标题 ##标题 #内容包含一个描述 ##描述 #内容包含多个标题和描述 ##标题和描述 ``` **2. 写入内容** ``` #内容内容 #此处添加任何需要的内容 #可以添加简单的排版 #例如: #内容包含一个标题 ##标题 #内容包含一个描述 ##描述 #内容包含多个标题和描述 ##标题和描述 ``` **3. 添加简单的排版** *可以用**#**符号添加标题 *可以用**#**符号添加描述 *可以用**#**符号添加多个标题和描述 **4. 示例** ``` #内容包含一个标题 ##标题 #内容包含一个描述 ##描述 #内容包含多个标题和描述 ##标题和描述 #可以添加简单的排版 #例如: #内容包含一个标题 ##标题 #内容包含一个描述 ##描述 #内容包含多个标题和描述 ##标题和描述 ``` **5. 注意事项** *可以使用**#**符号添加任何内容 *可以使用**#**符号添加任何描述 *可以使用**#**符号添加任何多个标题和描述 *可以使用**#**符号添加任何简单的排版

正文

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要点整理(表达式,转义,权限管理,日志)相似的内容:

[转帖]Linux:crontab要点整理(表达式,转义,权限管理,日志)

https://www.jianshu.com/p/fd46652f247e 摘要:Linux,crontab整理crontab的使用,包括cron表达式,设置和删除任务,权限管理,查看日志 crontab简介 crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任

[转帖]Linux | crontab定时任务及开机自启项

本文总结如何使用 crontab 创建定时任务及开启自启项 1。 本文基于 CentOS 7.9 系统所写。 Updated: 2022 / 9 / 5 Linux | crontab定时任务及开机自启 安装查询开机自启项开机自启动 设置开机自启项crond语法区别/etc/crontabcront

[转帖]Linux 磁盘I/O 调度算法 说明

2022-08-23 13:031361转载Linux 1 Linux 4.0 IO协议栈框架图 I/O 调度算法在各个进程竞争磁盘I/O的时候担当了裁判的角色。他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能。 Linux 4.0 IO协议栈框架图 I/O调度程序的总结 当向

[转帖]Linux中常见IO调度器

https://www.jianshu.com/p/3c16e39a005a 单队列调度算法多队列调度算法 deadline mqdeadlines cfq bfq noop none kyber 对于磁盘I/O,Linux提供了cfq, deadline和noop三种调度策略 cfq: 这个名字是

[转帖]Linux 平台使用shc 工具加密shell 脚本

2021-08-03 20:4510030原创Linux 本文链接:https://www.cndba.cn/dave/article/4642 1 shc 工具说明 shell 脚本是常用脚本,运维中经常使用,但有时候在shell 脚本中会包含一些敏感的信息,比如密码或者特殊的参数,此时我们就可以

[转帖]Linux系统多网卡环境下的路由配置

https://www.cnblogs.com/connect/p/linux-static-route.html Linux下路由配置命令 1. 添加主机路由 route add -host 192.168.1.11 dev eth0 route add -host 192.168.1.12 gw

[转帖]linux命令行下如何格式化json并进行各种json处理操作

https://blog.csdn.net/penriver/article/details/122016563 有时需要在linux 的命令行下,需要查看json的内容或针对json进行各种操作,本文针对此进行梳理、总结。 在Linux系统下基于python json.tool可以格式化json,

[转帖]Linux grep、egrep使用命令详解

https://segmentfault.com/a/1190000040654123?utm_source=sf-similar-article grep egrep区别 grep 默认不支持扩展 但可以通过-E 选择来支持扩展正则egrep 支持扩展正则 关于正则与扩展正则的区别可以看我另一篇s

[转帖]Linux kill & Java shutdownhook

https://www.jianshu.com/p/8001a66d37c9 shutdown-hook 建议加上shutdown的钩子 如果程序出现了内存溢出crash 则现在代码是没有任何保护措施的 或者说运维不小心关闭了服务器等 或者运维不小心kill了游戏服务器进程等 无法避免kill -9

[转帖]linux 调优篇 :硬件调优(BIOS配置)* 壹

https://blog.csdn.net/tony_vip?type=blog 一. 设置内存刷新频率为Auto二. 开启NUMA三. 设置Stream Write Mode四. 开启CPU预取配置五. 开启SRIOV六. 开启SMMU 通过在BIOS中设置一些高级选项,可以有效提升虚拟化平台性能