目录
零. 简介
一. cron
二. crontab
三. cron和crontab的区别
四. 例子
零. 简介
在 Ubuntu 系统中可以使用 crontab
来设置定时计划任务。crontab
是 Linux 下的无图形界面的计划任务工具,它可以在无需人工干预的情况下运行作业。
一. cron
在 Ubuntu 系统中可以使用 cron
来设置定时计划任务。cron
是 Linux 下的无图形界面的计划任务工具,它可以在无需人工干预的情况下运行作业。以下是在 Ubuntu 16.04 及其衍生版本中设置定时计划任务的一般步骤:
安装 cron
:
sudo apt install cron
开通并开启 cronie
后台服务:
sudo systemctl enable cron.servicesudo systemctl start cron.service
建立一个计划任务文件并编辑,例如创建一个名为 MyCrontab
的文件(名字可以随便取):
touch ~/MyCrontab && nano ~/MyCrontab
然后参考下面的 crontab 写法举例来编辑这个文件。
载入计划任务到 cron
服务模块中:
crontab ~/MyCrontab
查看 crontab
计划,确认是否一切就绪:
crontab -l
crontab 的语法格式如下:
m h dom mon dow command
其中各字段的含义和取值范围如下:
m
:表示分钟,可以是从 0 到 59 之间的任何整数。h
:表示小时,可以是从 0 到 23 之间的任何整数。dom
:day of month
的缩写,表示日期,可以是从 1 到 31 之间的任何整数。mon
:month
的缩写,表示月份,可以是从 1 到 12 之间的任何整数。dow
:day of week
的缩写,表示星期几,可以是从 0 到 7 之间的任何整数,其中 0 和 7 都代表星期天,也可以使用名称来表示,如sun
表示星期天,mon
表示星期一等。command
:待执行的命令。
一些常用的 crontab 写法举例如下:
*/1 * * * * date>>~/crontest
:每 1 分钟执行一次date>>~/crontest
命令(用date>>~/crontest
可以很清楚地看到测试效果)。5 * * * * ls
:指定每小时的第 5 分钟执行一次ls
命令。30 5 * * * ls
:指定每天的 5:30 执行ls
命令。30 7 8 * * ls
:指定每月 8 号的 7:30 分执行ls
命令。30 5 8 6 * ls
:指定每年的 6 月 8 日 5:30 执行ls
命令。30 6 * * 0 ls
:指定每星期日的 6:30 执行ls
命令。30 3 10,20 * * ls
:每月 10 号及 20 号的 3:30 执行ls
命令(注:“,”用来连接多个不连续的时段)。25 8-11 * * * ls
:每天 8-11 点的第 25 分钟执行ls
命令(注:“-”用来连接连续的时段)。*/15 * * * * ls
:每 15 分钟执行一次ls
命令,即每个小时的第 0、15、30、45、60 分钟执行ls
命令。30 6 */10 * * ls
:每个月中,每隔 10 天 6:30 执行一次ls
命令,即每月的 1、11、21、31 日的 6:30 执行一次ls
命令。50 7 * * * root run-parts /etc/cron.daily
:每天 7:50 以root
身份执行/etc/cron.daily
目录中的所有可执行文件(注:run-parts
参数表示执行后面目录中的所有可执行文件)。
需要注意的是,cron
是分用户的,系统级别的命令(如 /sbin/reboot
等)应该用 root
身份来编辑和载入 crontab
。服务器推荐以 root
身份设置 cron
,而 Linux 桌面系统的话可以使用普通用户。普通用户的 crontab
即便普通用户不登录也会自动执行,但如果普通用户载入的 crontab
中有只有 root
才能运行的命令,如 mkdir /test1
,那么它将不会被执行。
另外,在编辑 crontab
计划任务时,还需注意以下几点:
- 可以使用
crontab -e
编辑cron
计划,但这个只会更改内存中的crontab
任务。为了避免意外,建议先编辑硬盘上的计划任务文件(如上述的~/MyCrontab
文件),然后用crontab ~/MyCrontab
载入。
二. crontab
在 Ubuntu 中,可以使用 crontab
命令来创建、编辑和管理定时任务。crontab
是一个用于设置周期性被执行指令的工具。
crontab
的基本语法如下:
crontab -e
:编辑用户的crontab
文件。crontab -l
:列出用户当前的crontab
内容。crontab -r
:删除用户的crontab
文件。crontab -i
:在删除用户crontab
文件之前进行确认。
crontab
文件中每一行代表一个定时任务,其格式如下:
plaintext
* * * * * command
其中,五个星号分别表示分钟(0-59)、小时(0-23)、日期(1-31)、月份(1-12)、星期(0-7,0 表示星期天),command
则是要执行的命令或脚本。
通配符的含义如下:
*
:代表所有可能的值。例如,在分钟字段上表示每分钟。,
:用于指定多个值。-
:用于表示一个范围值。/
:用于表示重复的频率。例如,*/2
在分钟字段上表示每两分钟。
以下是一些定时任务的示例:
0 0 * * * /path/to/your/script.sh
:每天午夜执行/path/to/your/script.sh
脚本。0 2 * * * /path/to/another/script.sh > /path/to/logfile.log 2>&1
:每天凌晨 2 点执行/path/to/another/script.sh
脚本,并将标准输出和标准错误都追加到/path/to/logfile.log
文件中。*/5 * * * * /usr/bin/some_command
:每 5 分钟执行一次/usr/bin/some_command
命令。
在 Ubuntu 中,
cron
服务默认已安装。可以通过以下命令操作该服务:
service cron status
:查看服务运行状态。service cron start
:启动服务。service cron stop
:停止服务。service cron restart
:重启服务。
需要注意的是,每个用户都可以有自己的 crontab
文件,存储在 /var/spool/cron
目录中;root 用户的 crontab
文件通常存储在 /etc/crontab
文件中;使用 crontab
命令需要具有足够的权限;crontab
启动时会读取 crontab
文件并加载定时任务,可以使用 service crond restart
命令将其重新加载。
另外,在设置定时任务时,无论是命令还是脚本,建议使用绝对路径以确保准确性。如果定时任务涉及到环境变量或需要特定的运行环境,可能需要在脚本中进行相应的设置或使用完整的命令路径。同时,新创建的定时任务不会马上执行,可能需要过几分钟后才会生效,也可以通过重启 cron
服务来立即生效。
三. cron和crontab的区别
“cron”和“crontab”都与定时任务相关,但含义略有不同。“cron”通常指的是在系统后台运行的守护进程(daemon),它负责按照预定的时间表来执行任务。
“crontab”则是用于管理定时任务的命令或配置文件。通过“crontab -e”命令可以编辑用户的定时任务配置,这些配置信息被称为“crontab”。
简单来说,“cron”是执行定时任务的服务,而“crontab”是用于设置定时任务的工具和配置文件。
四. 例子
- 每天早上 8 点发送一封提醒邮件:
0 8 * * * mail -s "Daily Reminder" user@example.com < /path/to/reminder.txt
- 每周一凌晨 3 点备份数据库:
0 3 * * 1 mysqldump -u username -p password database > /path/to/backup/backup.sql
- 每月 1 号的 12 点清理临时文件:
0 12 1 * * rm -rf /tmp/temporary_files/*
- 每 30 分钟执行一次系统更新检查:
*/30 * * * * sudo apt-get update
- 每天晚上 10 点重启网络服务:
0 22 * * * sudo systemctl restart networking
- 每年 1 月 1 日的 0 点生成年度报告:
0 0 1 1 * /path/to/script/generate_annual_report.sh
- 每 2 小时同步一次数据:
0 */2 * * * rsync -avz source/ destination/
- 每逢周五下午 5 点将工作目录压缩备份:
0 17 * * 5 tar -czf /backup/workdir_$(date +\%Y\%m\%d).tar.gz /path/to/workdir
30秒 往 txt 文件 写入一个数:
* * * * * /path/to/your/script.sh
* +30 * * * * /path/to/your/script.sh
上述配置中,第一个命令表示每分钟的第 0 秒执行脚本,第二个命令表示每分钟的第 30 秒执行脚本,从而近似实现每 30 秒执行一次的效果。
然后您需要创建一个执行写入操作的脚本 script.sh
,示例如下(假设您使用 Bash 脚本)
#!/bin/bashecho "Some number" >> /path/to/your/txt_file.txt
效果图
若要编辑 crontab 任务,可以使用 crontab -e
命令。编辑完成后,系统会自动保存并生效。使用 crontab -l
命令可以列出当前用户的所有 crontab 任务。
如果是以其他用户身份设置 crontab 任务,需要使用 -u
参数指定用户名,例如管理员以其他用户身份编辑 crontab 任务的命令为:crontab -u linuxteck -e
。只有具有足够权限的用户(如 root 用户或超级用户,或者被赋予了特权的普通用户)才能执行该操作。查看其他用户的 crontab 任务的命令为:crontab -u linuxteck -l
。
同时,确保要执行的命令或脚本具有可执行权限,并且路径是正确的。如果在定时任务中使用的是脚本,建议在脚本的开头指定解释器,例如 #!/bin/bash
表示使用 Bash 解释器来执行该脚本。如果定时任务中的脚本需要使用特定的环境变量或依赖于某些环境设置,可以在 crontab 任务中添加相应的环境变量设置或在脚本中自行处理环境配置。
有些系统可能默认没有启动 cron 服务,需要使用相应的命令启动,例如 /sbin/service crond start
。还可以通过 chkconfig
或其他系统管理工具设置 cron 服务在开机时自动启动。
此外,crontab 不支持按秒来设置计划任务。如果需要更精确的时间控制,可能需要考虑其他方式来实现。并且,在实际应用中,要注意脚本的执行时间和资源消耗,避免多个任务同时运行导致系统负载过高。如果任务执行时间较长或资源消耗较大,可以考虑适当调整执行时间或优化任务本身。同时,定期检查 crontab 任务的执行情况,确保任务按照预期正常运行。如果任务出现异常或错误,可以查看系统日志(如 /var/log/cron)来获取相关信息进行排查和解决。