4
4
5
5
Cron 是一个用来执行定时任务的工具,可以在指定的时间自动执行重复性任务。
6
6
7
- 它的核心是 cron 守护进程,名为 crond。它在后台每分钟运行一次,检查是否有需要在指定时间执行的计划任务 。
7
+ 它的核心是 cron 守护进程,名为 crond。它在后台每分钟运行一次,检查是否有需要在当前时间执行的计划任务 。
8
8
9
9
下面命令可以查看 cron 守护进程,是否正常运行。
10
10
11
11
``` bash
12
+ # Ubuntu / Debian
12
13
$ sudo systemctl status cron
14
+ # or
15
+ $ ps aux | grep cron
16
+
17
+ # rockyOS / RHEL
18
+ $ sudo systemctl status crond
19
+ # or
20
+ $ ps aux | grep crond
13
21
```
14
22
15
23
## crontab
16
24
17
- crond 检查的定时任务,保存在 crontab 文件。该文件的每一行代表一个单独的作业 ,包含何时运行该任务,以及所要执行的命令。
25
+ crond 检查的定时任务,保存在 crontab 文件。该文件的每一行代表一个单独的任务 ,包含何时运行该任务,以及所要执行的命令。
18
26
19
27
crontab 分成两个级别:用户个人的crontab,系统的 crontab。前者由用户本人编辑,后者只能由根用户编辑。
20
28
21
- 系统的 crontab 存放在` /etc/crontab ` ,以及一系列特殊目录之中:` /etc/cron.daily ` 、` /etc/cron.hourly ` 、` /etc/cron.weekly ` 和` /etc/cron.monthly ` 。
29
+ 系统的 crontab 存放在` /etc/crontab ` (或目录` /etc/cron.d/ ` ),以及一系列特殊目录之中:` /etc/cron.daily ` 、` /etc/cron.hourly ` 、` /etc/cron.weekly ` 和` /etc/cron.monthly ` 。
30
+
31
+ ` crontab ` 本身也是一个命令,下面的命令可以检查现有的 cron 任务。
32
+
33
+ ``` bash
34
+ # 当前用户的 cron 任务
35
+ $ crontab -l
36
+
37
+ # 根用户的 cron 任务
38
+ $ sudo crontab -l
39
+
40
+ # 某个指定用户的 cron 任务
41
+ $ sudo crontab -u [USERNAME] -l
42
+ ```
22
43
23
44
## cron 任务的语法
24
45
@@ -59,18 +80,38 @@ crontab 文件中,以“#”符号开头的行表示注释。
59
80
60
81
以下是一些示例。
61
82
62
- - ` * * * * * ` 每分钟运行一次 cron 作业 。
63
- - ` 0 * * * * ` 每小时运行一次 cron 作业 。
64
- - ` 0 0 * * * ` 每天午夜运行 cron 作业 。
65
- - ` 0 2 * * * ` 每天凌晨 2 点运行 cron 作业 。
66
- - ` 0 0 15 * * ` 每个月 15 日午夜运行一次 cron 作业 。
67
- - ` 0 0 0 12 * ` 周六午夜运行 cron 作业 。
68
- - ` 0 0 * * 6 ` 从周一到周五每天下午 3 点运行 cron 作业 。
69
- - ` 0 15 * * 1-5 ` 从周一到周五每天下午 3 点运行 cron 作业 。
70
- - ` */5 * * * * ` 每 5 分钟运行一次 cron 作业 。
71
- - ` 0 8-16 * * * ` 每天、每小时、从上午 8 点到下午 4 点准时执行 cron 作业 。
83
+ - ` * * * * * ` 每分钟运行一次 cron 任务 。
84
+ - ` 0 * * * * ` 每小时运行一次 cron 任务 。
85
+ - ` 0 0 * * * ` 每天午夜运行 cron 任务 。
86
+ - ` 0 2 * * * ` 每天凌晨 2 点运行 cron 任务 。
87
+ - ` 0 0 15 * * ` 每个月 15 日午夜运行一次 cron 任务 。
88
+ - ` 0 0 0 12 * ` 周六午夜运行 cron 任务 。
89
+ - ` 0 0 * * 6 ` 从周一到周五每天下午 3 点运行 cron 任务 。
90
+ - ` 0 15 * * 1-5 ` 从周一到周五每天下午 3 点运行 cron 任务 。
91
+ - ` */5 * * * * ` 每 5 分钟运行一次 cron 任务 。
92
+ - ` 0 8-16 * * * ` 每天、每小时、从上午 8 点到下午 4 点准时执行 cron 任务 。
72
93
- ` 0 4 * * 2,4 ` 在周二和周四凌晨 4 点运行 cron 作业。
73
- - ` @reboot ` 系统启动时运行 cron 作业。
94
+ - ` @reboot ` 系统启动时或 crond 进程启动时运行 cron 任务。
95
+
96
+ 此外,还有几个特殊字母。
97
+
98
+ ` L ` 表示 Last,仅适用于“月份中的某一天”和“星期几”。
99
+
100
+ ``` bash
101
+ 0 4 L * * command -每月最后一天凌晨 4 点
102
+ 0 4 * * 5L command -每月最后一个星期五凌晨 4 点
103
+ ```
104
+ ` W ` 表示 weekday,即该月内最近的一个工作日,仅适用于“月份中的某一天”。
105
+
106
+ ``` bash
107
+ 0 4 15W * * command -每月 15 日最近的工作日(周一至周五)凌晨 4 点
108
+ ```
109
+
110
+ ` # ` 表示该月的第几个,仅适用于“星期几”。
111
+
112
+ ``` bash
113
+ 0 4 * * 5#2 -每月第二个周五凌晨 4 点
114
+ ```
74
115
75
116
### 环境变量
76
117
@@ -92,51 +133,64 @@ SHELL=/bin/sh
92
133
93
134
上面示例设定执行 cron 任务时,使用 Bash。
94
135
136
+ 添加其他环境变量,都是这种格式。
137
+
138
+ ``` bash
139
+ result=" HELLO WORLD"
140
+ ```
141
+
142
+ 上面示例添加了环境变量` result ` ,值为“HELLO WORLD”。
143
+
95
144
## cron 任务管理
96
145
97
146
### 个人任务
98
147
99
148
创建或编辑用户的 crontab 文件,使用下面的命令。
100
149
101
150
``` bash
102
- crontab -e
103
- ```
104
-
105
- 上面的命令会打开系统默认文本编辑器,对用户的 crontab 文件进行编辑。
151
+ # 编辑当前用户的 cron 任务
152
+ $ crontab -e
106
153
107
- 添加 cron 任务,只需在 crontab 文件中添加一个新行即可。例如,备份脚本 backup.sh 每天凌晨 3:00 运行,就是添加下面的内容。
154
+ # 编辑根用户的 cron 任务
155
+ $ sudo crontab -e
108
156
109
- ``` bash
110
- 0 3 * * * /home/linuxiac/backup.sh
157
+ # 编辑指定用户的 cron 任务
158
+ $ sudo crontab -u [USERNAME] -e
111
159
```
112
160
113
- 编辑完成后,保存并退出编辑器。Cron 服务会自动检查 crontab 文件,因此无需在更改后重新启动 Cron 进程 。
161
+ 上面的命令会打开系统默认文本编辑器,对用户的 crontab 文件进行编辑 。
114
162
115
- ` crontab -e ` 还会在保存和退出文件时,自动检查语法,防止意外输入无效的 cron 任务 。
163
+ 另一种方法是手动把 cron 任务添加到系统的 ` /etc/cronjob ` 文件,或者在 ` /etc/ cron.d/ ` 目录中创建一个新文件。建议使用后者,因为 ` /etc/cronjob ` 有可能在系统更新时被覆盖 。
116
164
117
- 下面命令可以列出当前用户的所有 cron 任务 。
165
+ 更新上面两个位置的 crontab 文件时,每个任务需要在第六个字段添加某个用户名,表示该任务运行在哪个用户名下 。
118
166
119
167
``` bash
120
- $ crontab -l
168
+ * * * * * user command
121
169
```
122
170
123
- 如果拥有根用户权限,可以查看其他用户的 cron 任务。
171
+ 定期运行脚本还有一种方法,就是使用` /etc/cron.* ` 目录,将脚本保存在以下目录之一的里面,就可以直接以根用户的身份运行该任务。(为了确保脚本可以运行,最好打开脚本的运行权限。)
172
+
173
+ - /etc/cron.hourly/
174
+ - /etc/cron.daily/
175
+ - /etc/cron.weekly/
176
+ - /etc/cron.monthly/
177
+
178
+ 添加 cron 任务,只需在 crontab 文件中添加一个新行即可。例如,备份脚本 backup.sh 每天凌晨 3:00 运行,就是添加下面的内容。
124
179
125
180
``` bash
126
- $ sudo crontab -u [用户名] -l
181
+ 0 3 * * * /home/linuxiac/backup.sh
127
182
```
128
183
129
- 上面示例中, ` [用户名] ` 是需要替换的部分 。
184
+ 编辑完成后,保存并退出编辑器。cron 服务会自动检查 crontab 文件,因此无需在更改后重新启动 cron 进程 。
130
185
131
- 编辑其他用户的 cron 任务,可以使用命令行参数 ` -e ` 。
186
+ ` crontab -e` 还会在保存和退出文件时,自动检查语法,防止意外输入无效的 cron 任务 。
132
187
133
- ``` bash
134
- $ sudo crontab -u [用户名] -e
135
- ```
188
+ 删除某个 cron 任务时,只要删除那一行即可。
136
189
137
- 删除某个 cron 任务时,只要删除那一行即可。 如果想要删除所有的 cron 任务,只要删除 crontab 文件即可,也可以使用命令行参数` -r ` 。
190
+ 如果想要删除所有的 cron 任务,只要删除 crontab 文件即可,也可以使用命令行参数` -r ` 。
138
191
139
192
``` bash
193
+ # 删除当前用户的所有 cron 任务,而且没有提示
140
194
$ crontab -r
141
195
```
142
196
@@ -145,9 +199,20 @@ $ crontab -r
145
199
如果希望删除前出现确认提示,则可以使用命令行参数` -i ` 。
146
200
147
201
``` bash
202
+ # 删除当前用户的所有 cron 任务之前,会有确认提示
148
203
$ crontab -i -r
149
204
```
150
205
206
+ 下面是删除根用户和其他用户的 cron 任务。
207
+
208
+ ``` bash
209
+ # 删除根用户的所有 cron 任务
210
+ $ sudo crontab -r
211
+
212
+ # 删除特定用户的所有 cron 任务
213
+ $ sudo crontab -u USERNAME -r
214
+ ```
215
+
151
216
### 系统任务
152
217
153
218
创建系统级别的 cron 任务,需要直接编辑` /etc/crontab ` 文件。
@@ -171,8 +236,22 @@ $ crontab -i -r
171
236
- /etc/cron.weekly/ 目录
172
237
- /etc/cron.monthly/ 目录
173
238
239
+ ### cron 任务的日志
240
+
241
+ cron 任务执行的 stdout 输出不会被记录,必须添加到命令或脚本本身。
242
+
243
+ ``` bash
244
+ 0 4 * * 5L command -v >> /var/logs/command.log
245
+ ```
246
+
247
+ 简单的执行记录,可以查看系统日志。Ubuntu / Debian 是` /var/log/syslog ` 或者` /var/log/auth.log ` ,RHEL/RHEL 是` /var/log/cron ` ,可以使用 grep 命令过滤日志。
248
+
249
+ ``` bash
250
+ $ sudo grep -i cron /var/log/syslog /var/log/auth.log
251
+ ```
252
+
174
253
## 参考链接
175
254
176
255
- [ How to Use Cron on Linux: Tips, Tricks, and Examples] ( https://linuxiac.com/how-to-use-cron-and-crontab-on-linux/ )
177
-
256
+ - [ Cron Jobs on Linux - Comprehensive Guide with Examples ] ( https://ittavern.com/cron-jobs-on-linux-comprehensive-guide/ )
178
257
0 commit comments