Linux如何跑一个定时任务
# 在Linux如何跑一个定时任务
我想要在服务器跑一个定时任务,比如,每天九点在钉钉给我发一个消息,这个能力应该怎么实现?
这个问题,可以借助 crontab 来实现
另外,如何实现发送到钉钉,可以参考钉钉官方的webhook文档 (opens new window),还是很简单的
# crontab 是什么
crontab是一个用于在Linux和Unix操作系统上定时执行任务的工具。它可以在指定的时间自动执行计划任务,是一种很常用的自动化工具。crontab是cron table的缩写,cron是Unix或类Unix系统的计划任务管理器。
ps:在大多数 Linux 发行版中,crontab 已经是系统自带的工具,无需额外下载;如果你服务器上没有,可以通过
yum install cronie
进行安装
# 实现
这里我通过一个crontab 任务来实现了,每天九点往钉钉机器人往群里发送一条消息
0 9 * * * /usr/bin/curl -H "Content-Type: application/json" -d '{"msgtype": "text","at":{"isAtAll":true},"text": {"content":"茅!茅!茅!"}}' https://oapi.dingtalk.com/robot/send\?access_token=66666692a55a9ceb6a0d1191d481ef81913b0cbed3f2b40c421d2b3eff6666
1
ps 这里的推送链接,是通过上面文档的方式生成的,每个群的都不一样,需要自己去生成
# crontab 语法
语法:crontab[-u <用户名称>][配置文件] 或 crontab [-u <用户名称>][-elr]
# 时间表达式语法
# 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
# | | | | |
# * * * * * user-name command to be executed
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
- minute: 表示分钟,可以是从0到59之间的任何整数。
- hour:表示小时,可以是从0到23之间的任何整数。
- day:表示日期,可以是从1到31之间的任何整数。
- month:表示月份,可以是从1到12之间的任何整数。
- week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
- command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
特殊字符:
- 星号(*):代表每的意思,例如month字段如果是星号,则表示每月都执行该命令操作。
- 逗号(,):表示分隔时段的意思,例如,“1,3,5,7,9”。
- 中杠(-):表示一个时间范围,例如“2-6”表示“2,3,4,5,6”。
- 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
# 1. 创建任务
该命令用于创建一个新的定时任务,也可以编辑已有的任务,在编辑模式下,输入对应的时间和任务命令即可添加任务
crontab -e
1
# 2. 查看定时任务列表
crontab -l
1
# 3. 清空任务列表
该命令用于清空当前用户的所有定时任务列表。
crontab -r
1
在删除当前用户的crontab任务时提示确认
crontab -i
1
# 配置文件
# 全局配置文件
在/etc目录下面存在
- cron.hourly、cron.daily、cron.weekly、cron.monthly、cron.d五个目录
- crontab,cron.deny二个文件
- cron.daily 是每天执行一次的job
- cron.weekly 是每个星期执行一次的job
- cron.monthly 是每月执行一次的job
- cron.hourly 是每个小时执行一次的job
- cron.d 是系统自动定期需要做的任务
- crontab 是设定定时任务执行文件
- cron.deny 文件就是用于控制不让哪些用户使用Crontab的功能
# crontab文件
cron 的主配置文件是 /etc/crontab,它包括下面几行:
[root@bulk ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# 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
# | | | | |
# * * * * * user-name command to be executed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
解释:
前三行是用来配置 cron 任务运行环境的变量。
- SHELL 变量的值告诉系统要使用哪个 shell 环境(在这个例子里是 bash shell);
- PATH 变量定义用来执行命令的路径。
- MAILTO cron 任务的输出被邮寄给 MAILTO 变量定义的用户名。 如果 MAILTO 变量被定义为空白字符串(MAILTO=""),电子邮件就不会被寄出。
# cron.allow 和 cron.deny文件
/etc/cron.allow和 /etc/cron.deny 文件被用来限制对 cron 的使用。
注意:
- 这两个使用控制文件的格式都是每行一个用户。
- 两个文件都不允许空格。
- 如果使用控制文件被修改了,cron 守护进程(crond)不必被重启。
- 使用控制文件在每次用户添加或删除一项 cron 任务时都会被读取。
- 无论使用控制文件中的规定如何,root 都总是可以使用 cron。
- 如果 cron.allow 文件存在,只有其中列出的用户才被允许使用 cron,并且 cron.deny 文件会被忽略。
- 如果 cron.allow 文件不存在,所有在 cron.deny 中列出的用户都被禁止使用 cron。
- 如果两个文件都不存在,只有root可以提交任务
# crontab 服务启动与关闭
service crond start #启动服务
service crond stop #关闭服务
service crond restart #重启服务
service crond reload #重新载入配置
service crond status #查看crontab服务状态
1
2
3
4
5
2
3
4
5
上次更新: 2024/01/10, 16:39:58