封面来源:https://cache.yisu.com/upload/information/20220118/481/171650.jpg

计划任务,顾名思义就是按照计划执行任务,最常见的是周期性备份数据,每天登录系统后进行系统更新,等等。Windows 内有自带的任务计划程序,但是入口隐藏的比较深,一般人也很难有机会使用(在控制面板内)。Linux 也为我们提供了两个非常有用的命令:atcron.

at

at 命令通常用于编排一次性调度执行的命令。但是,这个命令默认在绝大多数的发行版上没有安装,需要手动操作:

# Debian/Ubuntu
sudo apt install at

# Fedora/CentOS
sudo dnf install at

# Arch Linux
sudo pacman -S at

# Nix OS
sudo nix-env -iA nixos.at

输入命令后,会进入一个命令行状态,在里面可以直接输入你想要的命令。

指定时间

如果是绝对时间,很简单:

at 00:30
# date MUST EXACTLY be HH24:MI format

就像这样(任务默认从 1 开始编号,这里是测试了几个任务,因此到了 4):

你也可以在后面追加特殊关键字,例如 today, noon, midnight, teatime, tomorrow 等等。

或者,也可以用日期代替时间,例如 2025-12-0700:30 2025-12-07 等。

输入完命令后,使用 Ctrl + D(显示为上面的 <EOT>)结束

如果出现这个报错:

先检查 atd 是否已经启动:

sudo systemctl status atd

如果确实已经启动,那可能是某些系统内没有创建 /run 目录的软链接。请执行下面的命令(必须使用 sudo 或 root 权限):

sudo ln -s /var/run /run

再通过 systemctl 重启 atd 服务,就可以得到解决。

如果是相对时间,也不是很难:

at now + 4 hours

语法格式为:at now + 数量 单位,单位可以是 minutes, hours, days, weeks 等。如果你英语比较好,那使用起来应该不成问题。

指定运行脚本(常用)

在生产环境中,我们经常需要定时运行某个脚本。这样一来,我们就可以利用 at 达到定时执行的目的(请确保你的脚本存在!):

at -f RENAME_ME.sh 15:00

其他用法和上面一样,这里就不再赘述了。

cron

at 不同的是,cron 可以编排循环调度的命令,这使得我们可以一劳永逸,花点时间编写命令,然后交给系统自动执行。这个命令是大多数发行版上自带的

croncrontab 是相互依赖的两部分,需要周期性执行的指令都存放在 /etc/crontab 中,不能单独使用。

由于创建和管理计划的命令需要用到 crontab,下面来重点讲一下它的用法。

语法结构是:crontab -options

编辑和管理

编辑计划使用的是 -e 选项,或者说 crontab -e. 它默认编辑的是当前用户crontab 文件,也就是说最终这个列表里面的所有命令都是以当前用户的身份执行的。

第一次运行这个命令时,你会看到一片空白,这是很正常的,因为它之前没有人动过:

下面我们就来添加一些计划任务。每一个计划任务一行,必须遵循下面的格式:

MINUTE HOUR DAY MONTH WEEK your_command_or_script

其中,前面关于时间的部分分别表示:

  • 分钟 (0-59):每小时的第几分钟执行(可以不写前导 0)

  • 小时 (0-23):每天的第几小时执行(可以不写前导 0)

  • 日期 (1-31):每月的第几天执行

  • 月份 (1-12):每年的第几月执行

  • 星期 (0-7):每周的第几天执行(0和7都表示周日,也可以使用英语缩写)

下面是一些说明:

  1. 如果是一个单独的数字,则是刚好在这个时间点执行。

  2. 如果是多个数字以逗号分隔(不含空格),则是在指定的这几个时间点执行

  3. 如果是 /NUM 的形式(例如 /4),则表示每隔 NUM 分钟执行一次该命令。

  4. 如果是 NUM1-NUM2 的形式(例如 2-4),则表示从 NUM1 时间到 NUM2 时间执行命令。经常和上面的周期性执行一起使用。

  5. 如果是 *,则表示默认为一个对应时间段(例如一个小时)执行一次全部留空时,则代表每分钟执行一次。

举几个比较难理解的例子:

0 /12 * * * /home/debian/addnewbuild.sh

代表每 12 个小时执行一次位于 /home/debianaddnewbuild.sh 脚本。

0 6-12/2 * * 6-7 /run/cleanup.sh

代表每个节假日的早上 6 点到 12 点,每隔 2 小时执行一次位于 /run 目录下的 cleanup.sh 脚本。

11 4 5 1 4 /home/homo/chisho.sh

代表在每年的 1 月 5 日 1 月周四的凌晨 4 点 11 分执行位于 /home/homochisho.sh 脚本。(首.gif)

删除

直接删掉你想要的那一行或几行。这个没什么好讲的。

如果要删掉整个进程表,使用 crontab -r.

其他用法

要查看当前用户的进程表:crontab -l

对某一个用户(而不是当前用户)的进程表进行操作:crontab -u USERNAME ...

参考

https://www.runoob.com/linux/linux-comm-at.htmlhttps://www.runoob.com/linux/linux-comm-crontab.html

C/C++ 新人开发者,主攻 UE5,业余 Linux 运维