简单的排队系统?

简单的排队系统?

给定一台商用 PC,我们希望用它全天候在后台执行一些任务。

基本上,我们希望有这样的命令:

add-task *insert command here*
list-tasks
remove-task(s)

添加的任务应该简单地放入队列中并在后台逐个执行(退出 shell 后继续运行)。

有没有简单的脚本/程序可以做到这一点?

答案1

另一个解决方案是使用lpd,并创建一个运行您的作业的自定义“打印驱动程序”。当我有类似的请求时,一位朋友帮我解决了这个问题。制作一个这样的脚本,并将其放入/tmp/batch.sh

#!/bin/bash

TMPFILE=$(mktemp /tmp/XXXX)
exec <"$6"
cat - > $TMPFILE
chmod a+x $TMPFILE
$TMPFILE
rm -f $TMPFILE

然后运行:

lpadmin -p batch1 -E -P /tmp/batch.sh

这会启动一个队列,您可以使用其他名称而不是batch1来创建更多队列。添加职位:

lp -d batch1 /path/to/jobscript

lpq使用、lprm、 和管理作业lpstat。如果您希望更灵活地向作业传递参数,您可以使batch.sh 脚本更加精美。

(我batch在走这条路线之前尝试过,但要么它不能在 OSX 上作为队列工作,要么我使用错误。)

答案2

有一个标准batch命令或多或少可以做你想要的事情。更准确地说,batch当系统负载不太高时执行作业,一次一个(因此它不进行任何并行化)。该batch命令是包的一部分at

echo 'command1 --foo=bar' | batch      
echo 'command2 "$(wibble)"' | batch
at -q b -l              # on many OSes, a slightly shorter synonym is: atq -q b
at -q b -r 1234         # Unschedule a pending task (atq gives the task ID)

答案3

我注意到这个问题已经有好几年了,所以它可能对原始发布者没有帮助,但可能对其他人有帮助。

首先:“任务后台处理程序”就是答案。它非常强大,大多数 Linux 发行版和 Homebrew 都拥有它。

但是我使用的很多服务器,我无法轻松安装任意软件包,所以我需要一些理想的纯 bash(或 perl 等)。

经过一段时间的努力后,我想出了一个纯 bash 实现,到目前为止似乎运行良好。您可以在以下位置找到它:https://github.com/sitaramc/notes/blob/master/bq, 和文档

它只是一个 bash 脚本,因此安装很简单。然而,它满足了你的第二个和第三个要求(但实现这些要求也应该很简单)。

该脚本有大量评论,如果您愿意,您应该可以在几分钟内查看它。

答案4

排队系统有很多,但通常都非常专业。

你可能会调查at调度程序。它在某些方面很像cron,但它的设置更像是一次性作业的队列,而不是重复作业的队列。它可以根据时间以外的标准“安排”事务,例如系统负载或作业顺序。

您最喜欢的发行版几乎肯定会有它的软件包。

相关内容