简单的排队系统?


10

对于商用PC,我们想使用它在24小时不间断的后台执行某些任务。

基本上,我们希望有以下命令:

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

添加的任务只需放在队列中,然后在后台一个接一个地执行(退出shell后继续运行)。

有没有执行此操作的简单脚本/程序?

Answers:


7

有一个标准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)

batch命令“不执行任何并行化”是错误的。开始一个工作和开始下一个工作之间通常会有60秒的默认延迟;但是,没有什么可以让下一个作业等待第一个作业完成了- atd只要该-b选项设置的值用完,就会很高兴从批处理队列中启动作业(请参见atd手册页)。
rsaw 2016年

Batch不会严格地序列化任务,因此,如果您有一个共享资源,则@sitaram的答案(任务假脱机程序)应该更好地工作。
ergosys

5

另一种解决方案是使用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

管理与作业lpqlprmlpstat。如果要通过传递参数到作业来获得更大的灵活性,可以使batch.sh脚本更有趣。

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


我意识到@arnaud指定了“商品PC”,这意味着它可能不是OSX,我在此测试了该解决方案。但是,这应该是可移植的,并且比灵活得多batch
Joe Fusion

1
这可能是我见过的最真实的黑客之一。
Thiago Macedo

可悲的是,这似乎不再起作用。github.com/apple/cups/commit/…–
wdkrnls

4

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

您可能会调查at调度程序。从cron某些方面讲,它像设置一次作业而不是重复作业的队列。它可以按照时间以外的标准来“安排”事物,例如系统负载或作业顺序。

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


2

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

第一:答案是“任务后台处理程序”。它非常强大,Fedora至少拥有它。

但是我使用了很多服务器,没有很多麻烦,我无法安装任意软件包,因此我需要的东西是理想的纯bash(或perl等)。

经过一段时间的努力之后,我想到了一个纯bash实现,到目前为止看来效果还不错。您可以在https://github.com/sitaramc/bq上找到它。

它只是一个bash脚本,因此安装非常简单。但是,它会折衷您的第二个和第三个要求(但是实现这些要求也应该是微不足道的)。

对该脚本进行了自由注释,如果您愿意,您应该能够在几分钟内对其进行查看。


debian软件包是后台处理程序,可执行文件是“ tsp”,而不是与其他内容冲突的“ ts”。我也喜欢它,因为您可以对队列中的任务进行重新排序,而at / batch则无法做到。
ergosys
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.