dag*_*ies 12 process scheduling process-management
给定一台商用 PC,我们想用它在后台全天候执行一些任务。
基本上,我们希望有如下命令:
add-task *insert command here*
list-tasks
remove-task(s)
Run Code Online (Sandbox Code Playgroud)
添加的任务应该简单地放在一个队列中并在后台一个接一个地执行(在注销 shell 后保持运行)。
是否有任何简单的脚本/程序可以做到这一点?
小智 9
另一种解决方案是使用lpd
,并创建一个自定义“打印驱动程序”来运行您的作业。当我有类似的要求时,一位朋友帮我解决了这个问题。制作一个这样的脚本,并将其放入/tmp/batch.sh
:
#!/bin/bash
TMPFILE=$(mktemp /tmp/XXXX)
exec <"$6"
cat - > $TMPFILE
chmod a+x $TMPFILE
$TMPFILE
rm -f $TMPFILE
Run Code Online (Sandbox Code Playgroud)
然后运行:
lpadmin -p batch1 -E -P /tmp/batch.sh
Run Code Online (Sandbox Code Playgroud)
这将启动一个队列,您可以使用其他名称而不是 batch1 来创建更多队列。添加作业:
lp -d batch1 /path/to/jobscript
Run Code Online (Sandbox Code Playgroud)
管理与作业lpq
,lprm
和lpstat
。如果您希望更灵活地将参数传递给您的作业,您可以使 batch.sh 脚本更有趣。
(我batch
在沿着这条路线走之前尝试过,但它在 OSX 上不能用作队列,或者我使用错误。)
有一个标准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)
Run Code Online (Sandbox Code Playgroud)
小智 6
我注意到这个问题已经有好几年了,所以它可能对原始发布者没有帮助,但可能对其他人有帮助。
第一:“任务后台处理程序”就是答案。它非常强大,大多数 Linux 发行版和 Homebrew 都有它。
但是我使用的很多服务器,我无法轻松安装任意软件包,所以我需要一些理想的纯 bash(或 perl 等)。
经过一段时间的努力后,我想出了一个纯 bash 实现,到目前为止似乎运行良好。您可以在https://github.com/sitaramc/notes/blob/master/bq找到它,并附有文档。
它只是一个 bash 脚本,因此安装很简单。然而,它满足了你的第二个和第三个要求(但实现这些要求也应该很简单)。
该脚本有大量评论,如果您愿意,您应该可以在几分钟内查看它。