1.介绍 cron、crontab、cronjob
①cron:类Unix 系统上的一个后台守护进程(deamon),用于周期性地执行指定任务。不可见,没有TTY(非交互式环境)。
②crontab:cron表(cron table)的简称,是用户和系统定义定时任务的配置文件,也指管理该表的命令行工具。
③cronjob 通常是对“单条定时任务”或“一次调度作业”的非正式称呼,并不是一个独立的命令或文件名。
- 在日常口语或文档里,你会看到这样的用法:
“我在 crontab 里添加了一个 cronjob,每天凌晨运行备份脚本。”
关系:
①crontab 存放了多个 cronjob(即多行定时调度规则)。
②cron 守护进程负责调度所有 cronjob。
③cron 是 类Unix系统 中用于调度定时任务的后台守护进程(daemon),最早出现在 1979 年左右的 Version 7 Unix。
它会周期性地检查用户通过crontab定义的调度表(crontab),然后在指定时间执行相应命令或脚本。
2.crontab 文件格式
每一行代表一条任务,格式如下:
┌───────────── 分钟 (0 - 59)
│ ┌───────────── 小时 (0 - 23)
│ │ ┌───────────── 日 (1 - 31)
│ │ │ ┌───────────── 月 (1 - 12)
│ │ │ │ ┌───────────── 星期几 (0 - 7, 0 和 7 都表示周日)
│ │ │ │ │
│ │ │ │ │
* * * * * command-to-be-executed
各字段支持:
- *:通配,表示“每”
- 取值范围内数字,用逗号分隔(如 1,15,30)
- 范围(如 1-5)
- 步长(如 */10 表示每 10 分钟)
例如:
每1分钟执行一次 pwd:
*/1 * * * * pwd
在 crontab 里把标准输出和标准错误都写到一个文件,例如:
*/1 * * * * pwd >> /root/pwd.log 2>&1
>> /root/pwd.log
:把 pwd 的结果追加到 /root/pwd.log
2>&1
:把错误也合并到同一个文件
然后在终端用下面命令实时查看:
tail -f /root/pwd.log
0 3 * * * /path/to/your/script.sh
# 每天凌晨 2 点执行备份脚本
0 2 * * * /usr/local/bin/backup.sh
# 每 15 分钟同步一次时间
*/15 * * * * /usr/sbin/ntpdate time.example.com
# 每月的 1 号 3:30 重启 Apache 服务
30 3 1 * * systemctl restart apache2
# 每个工作日(周一到周五)上午 9 点清理 /tmp 目录
0 9 * * 1-5 /usr/bin/find /tmp -type f -mtime +7 -delete
# 每天 0 点将日志写入数据库(同时将环境变量写入)
0 0 * * * . /etc/profile; /opt/app/log_to_db.sh
3.常用 crontab 命令
1.编辑当前用户的 crontab 文件 (首次会提示选择编辑器,建议选择 vim.basic)
crontab -e
切换编译器
select-editor
2.列出当前用户已设置的所有定时任务。
crontab -l
3.删除当前用户所有的 crontab 任务。
crontab -r
4.查看指定用户的 crontab。
crontab -u 用户名 -l(仅限 root)
5.系统级的定时任务还可以放在:
①采用稍有差异的格式(多一个 “用户” 字段)
/etc/crontab
②分别对应不同周期的脚本目录
/etc/cron.d/、/etc/cron.hourly/、/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/
4. 使用与注意事项
1.环境变量:crontab 运行时默认只加载最少环境变量,必要时在命令前手动 source
2.日志:可将输出重定向到日志文件,便于调试;如:
0 1 * * * /path/to/job.sh >> /var/log/job.log 2>&1
3.第一次使用crontab -e
需要选择编译器,建议用vim.basic
root@ubuntu:~# crontab -e
no crontab for root - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed
Choose 1-4 [1]:
输入2,回车
5.介绍2>&1
在 Unix/Linux Shell 中,每个进程都有三个默认的文件描述符(FD):
0:标准输入 (stdin)
1:标准输出 (stdout)
2:标准错误 (stderr)
当你在命令后面写上:
> /path/to/logfile 2>&1
它实际上做了两件事:
> /path/to/logfile
等同于 1> /path/to/logfile
,将 stdout (fd1) 重定向到指定文件。
2>&1
表示把 stderr(fd2) 重定向到 fd1 当前指向的地方──也就是上一步已经指向的那个文件。
所以整条命令的效果就是:
①把标准输出写入 /path/to/logfile
②再把标准错误也写入同一个 /path/to/logfile
即:
your_command > /path/to/logfile 2>&1
等价于:
your_command 1> /path/to/logfile 2> /path/to/logfile
但写成 2>&1 更简洁,也能确保无论命令抛出什么错误信息,都能被统一收集到同一个日志文件中。