定时任务管理
# 1. 周期定时任务(cron)
在Linux系统中,定时任务通常是通过cron服务来管理的。cron是一个基于时间的作业调度器,它使用户能够自动化脚本或命令的执行。定时任务可以通过crontab命令来配置,每个用户都可以有自己的crontab文件,此外还有一个系统级的crontab。
cron服务在后台运行,检查是否有预定的作业需要在指定的时间执行。它会检查以下位置的配置文件:
1、 /etc/crontab
:这是系统的主crontab文件,包含了系统级别的定时任务配置。它通常由系统管理员编辑,用于设置系统范围的定时任务。
2、/etc/cron.d/
:这是一个目录,包含了系统的其他crontab文件。每个文件都代表一个独立的定时任务,由不同的软件包或服务创建和管理。
3、/var/spool/cron/crontabs/
:用户的crontab文件存储在这个目录下。每个用户都有一个以其用户名命名的文件,用于设置个人的定时任务。用户可以使用crontab -e命令编辑自己的crontab文件。
# 1.1 常用的crontab命令
crontab -l # 列出当前用户的crontab文件。
crontab -e # 编辑当前用户的crontab文件。
crontab -r # 删除当前用户的crontab文件。
crontab -u <username> -l # 作为root用户,列出其他用户的crontab文件。
2
3
4
crontab文件包含了一系列的作业和作业应当执行的时间。每一行都代表一个作业,格式如下:
每个星号(*
)可以用数字替换,表示特定的时间。还可以使用一些特殊字符来指定更复杂的时间安排:
\*
(星号)- 表示任意值,可以匹配任意时间单位(分钟、小时、日期、月份、星期几)。
- 例如,在小时字段使用
*
会导致每个小时的相同分钟执行任务。
\*/n
(斜线加数字)- 表示每
n
个单位时间执行一次任务。 - 例如,
*/5
在分钟字段中表示每5分钟执行一次任务。
- 表示每
n
(具体数值)- 表示特定的时间单位。
- 例如,在分钟字段中的
30
表示每小时的第30分钟执行任务。
n-m
(范围)- 表示一个时间范围。
- 例如,
1-5
在小时字段中表示从凌晨1点到凌晨5点(包括1点和5点)之间的每个小时执行任务。
n,m
(列表)- 表示特定的多个时间点。
- 例如,
1,3,5
在日期字段中表示每月的1号、3号和5号执行任务。
# 每分钟执行一次命令
* * * * * command # 每分钟执行一次。每个 "*" 代表时间的每个单位(分钟、小时、日期、月份、星期)。
# 每10分钟执行一次命令
*/10 * * * * command # 在分钟字段使用 "*/10" 表示从每个小时的开始每10分钟执行一次。
# 在每小时的第0分钟执行命令
0 * * * * command # 在分钟字段使用 "0",表示在每小时的开始执行。
# 在每天午夜(00:00)执行命令
0 0 * * * command # 分钟和小时字段都是 "0",表示在午夜执行。
# 在每个月的第一天的午夜执行命令
0 0 1 * * command # 日期字段为 "1",表示在每个月的第一天执行。
# 在每周日的午夜执行命令
0 0 * * 0 command # 星期字段为 "0"(或 "7",因为在Cron中0和7都表示星期日),表示每周日执行。
# 在工作日的每2小时(从上午9点到下午5点,包含9点和17点)执行命令
0 9-17/2 * * * command # 小时字段 "9-17/2" 表示从上午9点到下午5点,每2小时执行一次。
# 在每个月的1号和15号的中午12点执行命令
0 12 1,15 * * command # 日期字段 "1,15" 表示每月的1号和15号,在小时字段 "12" 表示中午12点。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 1.2 高级用法
- 环境变量: 在
crontab
文件中,可以设置环境变量,这些变量将会在cron作业执行时生效。
PATH=/usr/bin:/bin
SHELL=/bin/bash
* * * * * /path/to/script.sh
2
3
- 输出重定向: 通常,cron作业的输出会通过邮件发送给用户。如果要重定向输出到文件中,可以这样做:
* * * * * /path/to/command > /path/to/logfile 2>&1
这里>
是将标准输出重定向到文件,2>&1
是将标准错误也重定向到同一个文件。
- PATH问题:
cron
作业运行时的PATH
可能与你的交互式shell中的PATH
不同。为了确保作业能找到正确的命令,最好在脚本中设置完整的路径或者在crontab
中设置PATH
变量。
注意事项
- 权限问题: 确保你的脚本或命令有适当的权限能够被
cron
服务执行。 - 环境问题:
cron
作业可能不会加载你的.bashrc
或.profile
文件,因此你的环境变量可能不会被加载。确保在crontab
文件或脚本中明确设置所需的任何环境变量。 - 编辑器:
crontab -e
命令会使用默认的文本编辑器来编辑crontab
文件,如果你想使用其他编辑器,可以设置EDITOR
环境变量,如export EDITOR=vim
。
# 2. 执行一次任务(at)
在Linux系统中,at
命令用于安排一个一次性任务,这意味着任务被执行一次后,就不会再次执行。at
命令的执行依赖于atd
守护进程,这是一个在后台运行的进程,负责定期检查作业队列,并执行那些到了指定执行时间的任务。
atd
守护进程会在后台运行,定期检查作业队列,如果队列中有任务的执行时间与当前时间匹配,那么该任务就会被执行。默认情况下,atd
守护进程每60秒检查一次作业队列。- 使用
at
命令时,需要确保atd
守护进程正在运行。可以使用ps
命令或其他相关命令来检查atd
进程的状态。
提示:atd 不是系统内置进程,使用前需要安装 `yum install atd`
要使用at
命令,您需要指定一个时间,格式可以是多种多样的,例如:
# 语法:at [时间] [选项]
atq 或者 at -l # 查看所有at任务
atrm <job number> # 删除指定任务
at now + 1 minute # 在1分钟后执行任务。
at 5pm + 2 days # 在两天后的下午5点执行任务。
at 14:00 July 25 # 在7月25日的下午2点执行任务。
2
3
4
5
6
-c
:打印指定作业的内容到标准输出。-f
:从指定文件读取要执行的命令,而不是从标准输入读取。-v
:显示作业将被执行的时间,这是在提交作业时的反馈信息。-l
或-at
:这是atq
命令的别名,用于列出当前待执行的作业队列。-d
或-r
:这是atrm
命令的别名,用于删除指定的作业。-t
:使用特定的时间格式([CC]YYMMDDhhmm)。
at命令接受多种时间格式,例如:
now + count time-units
:从现在开始的一段时间后执行。HH:MM
:今天的特定时间,如果已经过了,则是明天。midnight
:午夜时刻。noon
:中午时刻。teatime
:下午4点。MMDDYY
,MM/DD/YY
,DD.MM.YY
:特定的日期。next
+weekday
:下一个指定的工作日。tomorrow
:明天这个时候。now
:立即执行(实际上会有几秒的延迟)。
# 使用echo将命令传递给at,安排在明天上午8点执行
echo 'echo "Hello, world!" | mail -s "Test mail" user@qq.com' | at 08:00 tomorrow
# 使用`-f`选项从`script.sh`文件中读取要执行的任务命令:
at -f script.sh 11:00 PM
2
3
4