Linux 特定时间执行任务
前言
人可以休息,服务器不能休息 —— SuburbiaXX
深夜,准备起身离开工位,发现服务器上的任务大概还有半个小时就跑完了,本着服务器不能停歇的原则,准备挂上下一个任务再满意离开,但是疲惫的身躯已坚持不到半小时后,这该如何是好
短暂的询问了
赛博之神
后,了解到 Linux 下的 at 指令,草草敲完就滚回宿舍了,不禁感叹这个简单的指令竟如此实用,便记录一下平常会使用到的情况
安装
- 一般情况下,Linux 系统都会自带 at 指令,如果没有的话,可以通过以下命令安装
sudo apt update
sudo apt install at - 安装完后,启动 atd 服务,并确保在启动时自动运行
sudo systemctl start atd
sudo systemctl enable atd
基本语法
- at 指令最最基本的语法如下
at [options] [TIME]
at [options] [Parameters]
# 查看 at 队列
atq
# 删除 at 队列中的任务
atrm [job number]
自由时间参数选择
[TIME]
参数指定了任务执行的时间,时间设定非常的自由
,可以是绝对时间,也可以是相对时间# 绝对时间,可以指定年、月、日、小时和分钟
# 能够接受在当天的 hh:mm 式的时间指定。假如该时间已过去,那么就放在第二天执行
at 4:00
# 支持 12 小时制可以使用 am 或 pm 来指定上午或下午
at 10pm
# 指定的日期必须跟在指定时间的后面,日期格式为 mm/dd 或 mm/dd/yy 或 dd.mm.yy
at 20:55 2024-05-24
# 相对时间,指定格式为:now + count time-units
# now 就是当前时间,time-units 是时间单位,这里能够是 minutes(min 也可以)、hours、days、weeks
# count 是时间的数量,几天,几小时
at now + 5 minutes
# 还可以是模糊时间概念
at today
at tomorrow
at midnight
at noon
# 下午四点
at teatime
# 甚至你可以结合起来玩
at 22:10 today
我的输出呢?
- Linux 下使用 at 命令时,默认情况下,at 任务的输出不会直接显示在终端上,而是通过邮件发送给用户。如果没有配置邮件服务,输出将无法查看
解决方案
安装 mail 服务
- 通过安装本地 mail 服务,可以在本地查看 at 任务的输出
sudo apt install mailutils
# 在设置里面选择 local only 配置,因为不是对外发送,只是本地查看 - 安装好后,可以通过
mail
命令查看邮件,此时就可以查看到 at 任务的输出了
输出重定向
- 嫌麻烦的话,可以通过重定向的方式将输出重定向到文件中,简单粗暴
常见用法
例如想在特定某个时间执行某脚本
可以把这个脚本作为 at 命令的输入
echo "/path/to/script.sh" | at now + 5 minutes
也可以先输入时间,再输入执行的内容
at 22:00
# 输入后会进入编辑模式,输入你想要执行的内容
at> /path/to/script.sh
# 然后按 Ctrl + D 结束输入,会自动输出下面一行
at> <EOT>
例如想用 python 运行某个文件
- 如下代码实现在 5 分钟后执行这个 python 脚本,并且将输出重定向到 out.log 文件中
echo "python /path/to/script.py > out.log" | at now + 5 minutes
- 或者先给出时间再给出执行内容
at now + 30 minutes
at> python /path/to/script.py > out.log
# 通过 Ctrl + D 结束输入
at> <EOT>
- 如下代码实现在 5 分钟后执行这个 python 脚本,并且将输出重定向到 out.log 文件中
参考
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 SuburbiaXX!