UNIX 是否提供任何方法来创建在特定时间定期启动的队列,然后让您逐渐向该队列添加一些任务,这些任务将在那时按顺序运行?
我知道cron
和at
,但是:
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
答案3
如果这些是单次运行作业(而不是周期性作业),那么我认为最简单的方法就是使用tmux
和sleep
。打开 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
日志文件即可检查状态!