前言

人可以休息,服务器不能休息 —— 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>

参考