在时间点创建任务队列

在时间点创建任务队列

UNIX 是否提供任何方法来创建在特定时间定期启动的队列,然后让您逐渐向该队列添加一些任务,这些任务将在那时按顺序运行?

我知道cronat,但是:

  • cron没有排队系统。
  • at似乎不支持顺序任务,并且以非常不友好的方式列出任务(“列出所有”仅打印任务编号和日期,而有关单个任务的信息则打印整个任务env。)

我设想这样的事情:

$ create queue a at midnight
$ add "ffmpeg -i a.mkv a.mp4" to a
$ add "ffmpeg -i b.mkv b.mp4" to a
$ add "ffmpeg -i c.mkv c.mp4" to a

$ create queue b at noon
$ add "mysqldump ..." to b

$ list queue a
RUNNING  ffmpeg -i b.mkv b.mp4
NEXT     ffmpeg -i c.mkv c.mp4

$ mail
>N 1 Task Daemon Thu Sep 1 00:23 <user@localhost> ffmpeg -i a.mkv a.mp4

郑重声明,我的实际需要是在晚上安排对 CPU/时间要求较高的任务,而我的笔记本电脑位于一个关着门的房间里,这样我就听不到风扇的声音(或感受到 CPU 的沸腾热量)。

答案1

你可能会谴责at,但如果你使用它,它就能达到你想要的部分效果。特征。如果您为at命令提供队列的单个大写字母名称,例如-q M,则该队列上的任何命令将仅在请求的时间运行如果系统负载小于0.8,启动作业会间隔60秒。

-l您可以使用选项和-b守护程序更改负载和间隔atd。作业按提交顺序运行,并atq -q M仅列出给定队列上的作业。

答案2

Cron 和 at 是 Unix 系统上唯一常安装的东西。但还有更发烧友作业调度系统在那里。有一个标准接口来对作业进行排队:qsub。如果您想安排下一个午夜的工作:

{ echo '#!/bin/sh'; echo 'ffmpeg -i a.mkv a.mp4'; } >a.script
qsub -a $(date -d 'tomorrow 0:00' +%Y%m%d%H%M) a.script

Ubuntu 包含两个实现 POSIX(NQS 派生)接口的作业调度程序:扭矩泥浆。还有其他开源实现,我对选择一个没有特别的建议。

答案3

如果这些是单次运行作业(而不是周期性作业),那么我认为最简单的方法就是使用tmuxsleep。打开 tmux 会话,然后执行以下操作:

$ echo "ffmpeg -i a.mkv a.mp4" > midnight.sh
$ echo "ffmpeg -i b.mkv b.mp4" >> midnight.sh
$ let secs_till_midnight=$(date -d "`date -d '+1 day' +%F`" +%s)-$(date +%s)
$ sleep $secs_till_midnight && sh midnight.sh

在同一会话的新窗格/窗口中安排更多作业,完成后,从该会话中分离。就是这样!您自己的自制调度程序!

即使您无法列出正在运行的任务,也可以在开头添加以下两行midnight.sh以获得额外的可见性:

set -x
exec 2>midnight_err >midnight_out

现在,每个命令在执行之前都会输出到终端,并且该命令的所有输出都会重定向到midnight_*文件。

现在只需附加到该会话或tail日志文件即可检查状态!

相关内容