我习惯了具有灵活排队配置可能性的 IBM i (AS/400) 批处理。我正在寻找类似的 Linux 批处理工具。
最重要的是一次从队列中取出一项作业并执行。之后,将扫描队列以查找更多条目。如果有,则获取下一个任务来运行。
at -b
相对接近,但如果一个作业占用的资源很少,导致负载保持较低,则会并行执行更多任务,这是不希望的。
运行部件是另一种选择,但它的行为过于静态,并且不会作为守护进程运行来查找给定队列中的新条目。我可以将它作为常规 cron 作业运行,但我需要自己处理要从队列中删除的作业。
我是否必须编写自己的代码或进行扩展才能实现我想要的功能,或者是否有可用的替代批处理排队机制?
答案1
您只需使用 bash 即可做到这一点:
1-使用 mkfifo 创建 fifo (您也可以创建文件)
mkfifo mybuff
2-尾部 fifo 并将每一行传递给您的执行程序(这将是一种任务服务器)
while IFS= read -r line
do
echo "Running: '$line' with bash"
bash -c "$line"
echo "Finished '$line' with exit code: $?"
done < <(tail -f mybuff)
3-例如将您的命令发送到队列(这将是客户端请求任务)
echo 'sleep 10' >> mybuff
echo 'echo "hello world"' >> mybuff
echo 'my fancy command to be executed' >> mybuff
...
PS:您可以像下面的示例一样简化步骤 2,但是当您将“exit”发送到命令缓冲区时,这将完成任务侦听器
tail -f mybuff | bash -x
答案2
ts - task spooler. A simple unix batch system
应该能够胜任这项任务。它运行任务假脱机程序/队列服务器,您可以使用简单的命令添加新任务,例如:
tsp yourcommand
您可以指定槽数 - 也就是一次应执行多少个作业。默认情况下,该值设置为 1,据我所知。它还具有一些高级功能,例如仅在先前的某个命令成功时才运行命令。您还可以查看每个作业的队列和详细信息。您可以在以下位置找到更多详细信息联机帮助页。