Linux 定时任务 crontab 和 Systemd Timer
一、说说八卦
说到定时任务,我们常用的就是 crond 服务,但是我们不知道还有另外一种定时方式,那就是 systemd
,我们常用 systemd
来管理我们的服务,但是我们却不知道,我们还可以通过 systemd
来设置定时任务。本文将记录下 crond
服务和 systemd
服务来设置定时任务。 (at 命令使用较少,在此未记录)
二 、crond服务
我们常用的定时任务就是 crond
服务,crontab
是crond
服务的常用命令,我们经常通过该服务来定时或者周期性帮我们执行一些任务。
crond 服务的一些基本概念
crond 读取配置文件会从以下几个路径读取:
/var/spool/cron/
, 由crontab -e
进行写入,配置文件无需指定用户/etc/crontab
,只能root
进行编辑,配置文件需指定用户/etc/cron.d/
,在此文件夹下创建定时任务文件,配置文件需指定用户
crond 服务的常用文件:
/var/spool/cron/
/etc/crontab
/etc/cron.d/
/var/log/cron
# crond 服务日志位置/etc/cron.deny
# 禁止使用 crond 服务的账号,默认创建的用户是允许使用 crond 服务的。要禁止某个用户,就直接将该用户名写入该文件
crontab 常用命令
# 查看当前的 crontab 任务
crontab -l
# 编辑 crontab 任务,不符合规则的任务会报错。
crontab -e
# 帮助其他用户查看/编辑 crontab 任务,只有 root 用户才可以使用。
crontab -u username -l # 查看
crontab -u username -e # 编辑
# 删除所有的 crontab 任务
crontab -r
# crond 服务状态
systemctl status crond
# crond 服务启动/暂停/重启
systemctl start/stop/reload crond
**crontab 定时任务基本语法 **
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * command to be executed
字符 | 含义 |
---|---|
* | 任何时刻,放在分钟位置上就表示每分钟。放在小时位置就表示每小时。 |
, | 分割时段,比如要在3点和6点都执行,就可以写 3,6 |
- | 表示一个区间,比如要1点到5点的20分都执行任务,20 1-5 * * * command |
/n | n代表的是数字,表示每隔 n 个时间执行一次。 比如要每2分钟执行任务,*/2 * * * * command |
crontab -e (/var/spool/cron) 配置
crontab -e 命令是会检查语法的,语法错误的话,是会不通过的,crontab -e 保存在 /var/spool/cron
文件夹下,并且是以创建用户命名的,比如我们root
用户创建的定时任务就是保存在 ``/var/spool/cron/root`
crontab 使用示例:
以下命令都是通过crontab -e
进行编辑的
要在每天23点10分和1点10分对数据库进行备份,数据库备份脚本为
/opt/scripts/back.sh
。10 23,1 * * * /opt/scripts/back.sh
要在 0点到6点 每隔2小时 对数据库进行备份,数据库备份脚本为
/opt/scripts/back.sh
0 0-6/2 * * * /opt/scripts/back.sh
/etc/crontab 配置
/etc/crontab
的语法格式和 crontab -e
大致相同,前者需要指定用户,后者不需要。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root # 指的就是当有 stdout 和 stderr 时,发送mail 给谁,默认是root,我们可以指定我们的e-mail账号,但是前提要在本地配置好邮件发送账号
* * * * * user-name command to be executed
#示例:25-32/2 * * * * root /opt/test.sh
/etc/cron.d/ 配置
在 /etc/cron.d/
下创建一个文件,文件配置和/etc/crontab
是一样的,需要指定用户。
注意点:
在 Linux 底下的 crontab 會自動的幫我們每分鐘重新讀取一次 /etc/crontab 的例行工作事項,但是某些原因或者是其他的 Unix 系統中,由於 crontab 是讀到記憶體當中的,所以在你修改完 /etc/crontab 之後,可能並不會馬上執行, 這個時候請重新啟動 crond 這個服務吧!『systemctl restart crond』
我们在设置计划任务时需要注意一个问题,就是 如果我们设置了月日,就不要设置星期,这两者是冲突的,只能同时存在一个。
* 15 * * 1-5 /usr/local/bin/tea_time.sh
该脚本表示,每周一到周五下午3点,3点的每分钟执行一次脚本
/usr/local/bin/tea_time.sh
三 、systemd 服务
之前对于systemd
具有定时任务的功能还是只有耳闻,并没有实际操作过,今天进行实际操作了下,发现也不错的。
systemd
实际是通过定义一个timer
单元来创建一个定时任务。它包含了两大内容,首先定义一个service
单元,这个service
单元定义了我们想定时执行的任务。然后再定义一个timer
单元,通过timer
单元定义定时规则去执行之前的service
单元。
1. 创建定时脚本
首先我们创建一个脚本叫做 now_time.sh
,脚本内容就是输出当时的时间:
cat <<EOF >/opt/now_time.sh
#!/bin/bash
echo "$(date)" >>/tmp/time_record.log
EOF
chmod 755 /opt/now_time.sh # 注意一定要更改权限,否则后面会由于没有执行权限而报错
2. 创建 Service
单元
然后需要创建一个 Service单元 timerecord
cat <<EOF >/usr/lib/systemd/system/timerecord.service
[Unit]
Description=now time service
[Service]
ExecStart=/opt/now_time.sh
[Install]
WantedBy=multi-user.target
EOF
然后把 timerecord
作为系统服务。
systemctl start timerecord
**3. 创建 Timer
单元 **
在创建 Timer
单元前,我们需要先了解下如何配置 Timer
,
[Unit] # 定义元数据
[Timer] #定义定时器
OnActiveSec:定时器生效后,多少时间开始执行任务
OnBootSec:系统启动后,多少时间开始执行任务
OnStartupSec:Systemd 进程启动后,多少时间开始执行任务
OnUnitActiveSec:该单元上次执行后,等多少时间再次执行
OnUnitInactiveSec: 定时器上次关闭后多少时间,再次执行
OnCalendar:基于绝对时间,而不是相对时间执行,用于和 crond 类似的定时任务 ,以实际时间执行。
AccuracySec:如果因为各种原因,任务必须推迟执行,推迟的最大秒数,默认是60秒
Unit:真正要执行的任务,默认是同名的带有.service后缀的单元
Persistent:如果设置了该字段,即使定时器到时没有启动,也会自动执行相应的单元
WakeSystem:如果系统休眠,是否自动唤醒系统
示例:
在系统启动15分钟后启动,并在系统运行时,每周启动一次。
[Unit]
Description=Run foo weekly and on boot [Timer]
OnBootSec=15min
OnUnitActiveSec=1w [Install]
WantedBy=timers.target
每周执行一次(周一凌晨0点)。激活后,如果错过了上次启动时间,,它会立即触发服务,例如由于系统断电:
[Unit]
Description=Run foo weekly [Timer]
OnCalendar=weekly
Persistent=true [Install]
WantedBy=timers.target
每天周一下午3点10分运行
如果需要具体的时间,我们可以给
OnCalendar
设定具体时间值,形如Year-Month-Day Hour:Minute:Second
[Unit]
Description=Run timerecord on Monday 3:10 [Timer]
OnCalendar=Mon *-*-* 15:10:00
Unit=timerecord [Install]
WantedBy=timers.target
每隔5秒执行一次
[Unit]
Description=Run timerecord every 5s [Timer]
OnUnitActiveSec=5s # 可以设置为 5m,1h
Unit=timerecord [Install]
WantedBy=timers.target每个小时的每隔10分钟 进行备份服务
[Unit]
Description=backup [Timer]
OnCalendar=*-*-* 0/1:0/10:00
Unit=backup [Install]
WantedBy=multi-user.target
创建 Timer
单元 record
:每隔1分钟执行一次
cat <<EOF > /usr/lib/systemd/system/timerecord.timer
[Unit]
Description=Run timerecord every 5s
[Timer]
OnUnitActiveSec=1m # 可以设置为 5m,1h
Unit=timerecord #指定 Service 服务名
[Install]
WantedBy=timers.target
EOF
启用定时任务
systemctl daemon-reload #重新加载配置
systemctl start timerecord.timer # 启动定时任务
常用命令:
systemctl start timerecord.timer# 启动定时任务
systemctl stop timerecord.timer# 暂停定时任务
systemctl status timerecord.timer# 查看定时任务服务状态
systemctl restart timerecord.timer# 重启定时任务状态
systemctl list-timers --all # 查看定时任务列表
systemctl daemon-reload # 更改了配置文件后,需要重新加载
journalctl -u mytimer.timer # 查看 mytimer.timer 的日志
journalctl -u mytimer # 查看 mytimer.timer 和 mytimer.service 的日志
journalctl -f # 从结尾开始查看最新日志
journalctl -f -u timer.timer # 从结尾开始查看 mytimer.timer 的日志
参考文献:https://wiki.archlinux.org/index.php/Systemd/Timers
http://www.ruanyifeng.com/blog/2018/03/systemd-timer.html
Linux 定时任务 crontab 和 Systemd Timer的更多相关文章
- 【转帖】Linux定时任务Crontab命令详解
Linux定时任务Crontab命令详解 https://www.cnblogs.com/intval/p/5763929.html 知道有crontab 以及 at 命令 改天仔细学习一下 讲sys ...
- 如何让linux定时任务crontab按秒执行
如何让linux定时任务crontab按秒执行? linux定时任务crontab最小执行时间单位为分钟如果想以秒为单位执行,应该如何设置呢?思路 正常情况是在crontab中直接定义要执行的任务,现 ...
- linux定时任务crontab的设置
linux定时任务crontab的设置http://www.blogjava.net/freeman1984/archive/2010/09/23/332715.html vi /etc/cronta ...
- Linux定时任务Crontab命令详解_转
转自:Linux定时任务Crontab命令详解 (部分修改) linux 定时系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服 ...
- linux定时任务crontab怎样执行root命令
在/var/spool/cron/文件夹下放置了所有定时任务文件, 1.运行crontab -u $用户名 -e会显示$用户的所有定时任务: 2.运行sudo crontab -e会显示root用户所 ...
- Linux 定时任务 Crontab命令 详解
前言 crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用crontab,那么任务就是常驻程序,这对你的程序要求比 ...
- linux定时任务crontab
今天在执行mysql定时任务语句时候问了很多大拿,都建议我不要随便在生产环境下写定时任务这样的语句,有的说会有延时,那样的话就不准了,有的说在.系统时间和本地时间不一致怎么办?后来就建议我用linux ...
- Linux定时任务Crontab使用 提示no crontab for root
使用命令查询crontab 任务时,一直提示:no crontab for root .查看了一些资料,说是crontab在初始时,设置了一次编辑方式,所以试了一下crontab -e的方式编辑,即在 ...
- 小记---------关于linux 定时任务crontab
linux的crontab定时任务 启动服务: service crond start 关闭服务: service crond stop 重启服务: service crond ...
随机推荐
- Oracle 忘记sys与system管理员密码重置操作
首先打开cmd 执行 orapwd file=C:\app\PWDorcl.ora password=orclorcl C:\app\PWDorcl.ora是你要存放的路径文件 Password=or ...
- Java 正则表达式之捕获组
Java 正则表达式之捕获组 1. Java 正则表达式基础 2. Java 正则表达式之捕获组 一.概述 1.1 什么是捕获组 捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显 ...
- php流程控制
return 例子一: <?php function add($a,$b){ echo "echo"; return $a+$b; //return 一般用于function ...
- Centos 7 搭建.net web项目
现在的.NET Core 1.0版本是一个很小的核心,APIs和工具也并不完整,但是随着.Net Core的不断完善,补充的Apis和创新也会一起整合到.NET Framework中. 安装cento ...
- kali安装配置ftp
参考:https://zhidao.baidu.com/question/1511146077646448900.html 一)安装 1.用sudo apt-get install 下载安装包
- java时间与js时间
这是一个由java获取的系统时间与js获取的系统时间不一致导致的测试缺陷 定义方式: java Date date = new Date(); js var Date date2 = new Date ...
- C++语言学习
1.< >表示包含那些由系统提供的并放在指定子目录中的头文件,对于自己编写的头文件放在当前目录或其他目录下则用双引号” ”; 2.复合类型的声明: int* p1,p2;//p1是指向in ...
- 如何在html与delphi间交互代码
[转]如何在html与delphi间交互代码 (2015-11-19 22:16:24) 转载▼ 标签: it 分类: uniGUI uniGUI总群中台中cmj朋友为我们总结了如下内容,对于利用de ...
- Redis 基础、高级特性与性能调优
本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍.之后概览Redis提供的高级能力,并在部署.维护.性能调优等多个方面进行更深入的介绍和指导. ...
- ASP.NET WebApi JObject 使用
ASP.NET WebApi 中使用非Get请求,传递参数需要用对象包裹起来,比如: [HttpPost] public async Task<IActionResult> PostVal ...