如何使用 Linux 的“cron”实用程序安排任务
熟练的系统管理员知道何时以及如何以编程方式安排任务以特定间隔执行,无论这些任务是重复执行还是按一定次数执行。您可以在许多场景中应用此技能,例如安排备份、定期收集系统日志或自动执行基本重复任务。
您可以通过多种方式安排任务,在本文中,我将重点介绍cron
实用程序。我的同事 Ken之前写了一篇关于 的很棒的文章cron
,所以我建议您查看它,以及我之前关于命令 的文章,at
这是在 Linux 中安排任务的另一种方法。
在本文中,我将尝试尽可能简洁、直接和实用,这意味着我将无法探索所有可用的选项cron
。
cron 的工作原理
在使用 之前,我将介绍一些基础知识cron
。首先,cron
还使用守护进程 ( crond
) 来读取不同的配置文件。目录中每个用户都有一个 cron 文件/etc/cron.d/
,该/etc/crontab
文件是系统范围的。每个用户管理自己的计划作业和cron
配置文件。
$ sudo systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2022-11-11 15:13:12 -03; 1h 17min ago
Main PID: 2732 (crond)
Tasks: 2 (limit: 23644)
Memory: 73.7M
CGroup: /system.slice/crond.service
├─2732 /usr/sbin/crond -n
└─4752 /usr/sbin/anacron -s
nov 11 15:13:12 demo.example.local systemd[1]: Started Command Scheduler.
nov 11 15:13:12 demo.example.local crond[2732]: (CRON) STARTUP (1.5.2)
nov 11 15:13:12 demo.example.local crond[2732]: (CRON) INFO (Syslog will be used instead of sendmail.)
nov 11 15:13:12 demo.example.local crond[2732]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 33% if used.)
nov 11 15:13:13 demo.example.local crond[2732]: (CRON) INFO (running with inotify support)
nov 11 15:13:13 demo.example.local CROND[2754]: (root) CMD (sleep 60 && /sbin/katello-tracer-upload > /dev/null 2>&1)
nov 11 16:01:01 demo.example.local CROND[4743]: (root) CMD (run-parts /etc/cron.hourly)
nov 11 16:01:01 demo.example.local anacron[4752]: Anacron started on 2022-11-11
nov 11 16:01:01 demo.example.local anacron[4752]: Will run job `cron.daily' in 43 min.
nov 11 16:01:01 demo.example.local anacron[4752]: Jobs will be executed sequentially
$ ls -l /etc/crontab
-rw-r--r--. 1 root root 451 jan 8 2021 /etc/crontab
$ ls -l /etc/cron.d/
total 16
-rw-r--r--. 1 root root 128 set 30 2021 0hourly
-rw-r--r--. 1 root root 450 set 23 18:11 foreman_scap_client_cron
-rw-r--r--. 1 root root 112 fev 10 2022 katello-tracer-upload
-rw-r--r--. 1 root root 108 fev 24 2022 raid-check
使用“cron”安排作业
要操作计划cron
作业,您可以编辑crontab
文件(用于系统范围的任务)或在用户cron.d
目录中创建文件(用于特定任务),并在其中包含必要的参数。以下是最常见的 crontab 参数:
-l
在标准输出上显示当前crontab
(来自当前用户的作业)。-r
删除当前crontab
(当前用户的作业)。-e
使用 VISUAL 或 EDITOR 环境变量指定的编辑器编辑当前crontab
(当前用户的作业)。退出编辑器后,修改的内容crontab
将自动安装。
理解计划如何工作的最重要的部分cron
是了解文件中使用的语法crontab
,如下所示(取自空的默认crontab
文件):
$ 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
此外,您还可以:
- 使用xy表示范围:例如,
1-5
在“天数”列中放置从周一到周五运行的作业。 - 使用x,y作为列表:例如,
5,10-13,17
在“分钟”列中放置一个作业,使其在整点后 5、10、11、12、13 和 17 分钟运行。 - 使用*/x表示间隔x:例如,
*/7
在“分钟”列中每七分钟运行一次作业。
首先检查当前用户是否有任何计划的作业:
$ crontab -l
no crontab for localuser
尝试一个例子
假设您有一个名为 的目录/home/localuser/source
,您需要在每天快结束的时候(晚上 11 点)将 增量备份到 目录/home/localuser/destination
。并且每周六中午,您需要/home/localuser/destination
将 完全备份到/home/localuser/full
目录。
以下是上面描述的目录结构:
$ mkdir source destination full
$ for i in 1 2 3; do touch ./source/file$i.txt; done
$ ls -lR
.:
total 0
drwxrwxr-x. 2 localuser localuser 6 nov 11 17:09 destination
drwxrwxr-x. 2 localuser localuser 57 nov 11 17:10 source
./destination:
total 0
./full:
total 0
./source:
total 0
-rw-rw-r--. 1 localuser localuser 0 nov 11 17:10 file1.txt
-rw-rw-r--. 1 localuser localuser 0 nov 11 17:10 file2.txt
-rw-rw-r--. 1 localuser localuser 0 nov 11 17:10 file3.txt
接下来,编辑crontab
文件并添加必要的参数来完成这些任务:
$ crontab -e
no crontab for localuser - using an empty one
crontab: installing new crontab
$ crontab -l
00 23 * * * localuser rsync -av /home/localuser/source /home/localuser/destination
00 12 * * 6 localuser cp -R /home/localuser/destination/* /home/localuser/full/
计划作业运行后,结果如下(只是模拟):
$ ls -lR
total 0
drwxrwxr-x. 3 localuser localuser 20 nov 11 18:11 destination
drwxrwxr-x. 3 localuser localuser 20 nov 11 18:12 full
drwxrwxr-x. 2 localuser localuser 57 nov 11 17:10 source
./destination:
total 0
drwxrwxr-x. 2 localuser localuser 57 nov 11 17:10 source
./destination/source:
total 0
-rw-rw-r--. 1 localuser localuser 0 nov 11 17:10 file1.txt
-rw-rw-r--. 1 localuser localuser 0 nov 11 17:10 file2.txt
-rw-rw-r--. 1 localuser localuser 0 nov 11 17:10 file3.txt
./full:
total 0
drwxrwxr-x. 2 localuser localuser 57 nov 11 18:12 source
./full/source:
total 0
-rw-rw-r--. 1 localuser localuser 0 nov 11 18:12 file1.txt
-rw-rw-r--. 1 localuser localuser 0 nov 11 18:12 file2.txt
-rw-rw-r--. 1 localuser localuser 0 nov 11 18:12 file3.txt
./source:
total 0
-rw-rw-r--. 1 localuser localuser 0 nov 11 17:10 file1.txt
-rw-rw-r--. 1 localuser localuser 0 nov 11 17:10 file2.txt
-rw-rw-r--. 1 localuser localuser 0 nov 11 17:10 file3.txt
最后,要删除计划的作业,只需运行 crontab -r
:
$ crontab -l
00 23 * * * localuser rsync -av /home/localuser/source /home/localuser/destination
00 12 * * 6 localuser cp -R /home/localuser/destination/* /home/localuser/full/
$ crontab -r
$ crontab -l
no crontab for localuser
这是一个基本示例,您可以了解其cron
工作原理。我希望您可以进一步探索该实用程序并发现它提供的所有其他可能性。
包起来
了解如何在系统中安排任务和作业非常重要。某些系统任务是默认安排的,因此您必须了解它们的工作原理。此外,您需要自动化和安排延迟和重复作业,以便在必要时运行以实现可编程目标。该cron
实用程序将帮助您实现这一点,它是您的实用程序工具包中必备的基本工具。
我希望本文和我关于该at
实用程序的相关文章能够帮助您理解这个主题并增加您的一般系统管理知识。