在 Linux 中,我们可以通过计划任务来实现指定时间或者周期性地自动执行命令或脚本的功能。计划任务可以分为一次性计划任务和周期性计划任务。
一次性计划任务
at 命令用于设置在未来某个时间点执行一次的任务。at 命令的选项有:
-f 文件从指定文件读取命令而不是标准输入-m任务完成后发送邮件给用户-l列出待执行的任务-d 任务ID删除指定任务-v显示任务被执行的时间
从shell设置一次性任务的示例如下:
$ at 15:30
at> echo "Hello at command" > ~/at_test.txt
at> # 按 Ctrl+D 结束输入
job 1 at Tue Jul 18 15:30:00 2023
设置完一次性任务后,我们可以使用 atq 或者 at -l 来查看设置的一次性任务。
需要注意:计划任务执行的时候没有终端,因此输出应该到文件中。而且任务中的命令,最好带上全路径,而不是直接使用。
周期性计划任务
基本使用
crontab 用于设置周期性被执行的任务。我们需要使用 crontab -e 命令来编辑当前用户的 crontab 文件,如下所示:
# 在crontab 文件中,设置每1分钟执行一次
# 把 hello world 字符串输入到 hello 文件中的任务
* * * * * echo "hello world" > /hello
其中 * * * * * 的作用如下:
* * * * *
- - - - -
| | | | |
| | | | +----- 星期几(0-7,0和7都表示周日)
| | | +------- 月份(1-12)
| | +--------- 日期(1-31)
| +----------- 小时(0-23)
+------------- 分钟(0-59)
不同时间的示例如下:
# 每小时的第3和第15分钟执行
3,15 * * * * myCommand
# 在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * myCommand
# 每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * myCommand
# 每周一上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 myCommand
# 每晚的21:30重启smb
30 21 * * * /etc/init.d/smb restart
# 每月1、10、22日的4 : 45重启smb
45 4 1,10,22 * * /etc/init.d/smb restart
# 每周六、周日的1 : 10重启smb
10 1 * * 6,0 /etc/init.d/smb restart
# 每天18 : 00至23 : 00之间每隔30分钟重启smb
0,30 18-23 * * * /etc/init.d/smb restart
# 每星期六的晚上11 : 00 pm重启smb
0 23 * * 6 /etc/init.d/smb restart
# 每一小时重启smb
0 */1 * * * /etc/init.d/smb restart
# 晚上11点到早上7点之间,每隔一小时重启smb
0 23-7/1 * * * /etc/init.d/smb restart
除了 crontab - e 命令外,还有:
crontab -l查看当前用户的 crontab 文件crontab -r删除当前用户的 crontab 文件crontab -u username -l列出某个用户的 crontab 文件(需要有相应的权限)crontab -u username -e编辑某个用户的 crontab 文件(需要有相应的权限)
crontab 相关的配置文件
/var/spool/cron/目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名/etc/crontab这个文件负责调度各种管理和维护任务。/etc/cron.d/这个目录用来存放任何要执行的crontab文件或脚本。- 我们还可以把脚本放在
/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly目录中,让它每小时/天/星期、月执行一次。