Nq –一个简单的Unix作业队列系统

2021-01-28 22:12:48

这些小型实用程序允许创建非常轻量级的作业队列系统,而无需任何设置,维护,监督或任何长期运行的过程。

nq应该可以在任何POSIX.1-2008兼容系统上运行,该系统还可以提供正常运行的flock(2)。在Linux 2.6.37,Linux 4.1,OpenBSD 5.7,FreeBSD 10.1,NetBSD 7.0.2,Mac OS X 10.3和SmartOS joyent_20160304T005100Z上进行了测试。

预期的目的是临时对命令行进行排队(例如,用于构建Makefile的多个目标,一次下载多个文件,以多种配置运行基准测试,或者仅仅是作为荣耀的nohup),但是作为任何好的Unix工具,它都可以随便你怎么虐待。

时间戳记强制执行作业顺序。nq在启动时立即获得。同步发生在文件系统级别。计时器分辨率以毫秒为单位。不需要亚秒级文件系统时间戳。不使用轮询。严格执行独占执行。

为什么要植绒(2)?因为它锁定文件句柄,该句柄与子进程(实际作业)在exec(2)之间共享,并且在文件关闭时(通常是在作业终止时)它将解锁。

您使用nq CMDLINE排队(获得它?)新作业。输出作业ID(除非使用-q禁止显示),并且nq立即分离,在后台运行该作业。 STDOUT和STDERR被重定向到日志文件。

nq尽力(但不能保证)以确保当前正在运行的作业的日志文件设置了+ x位。因此,您可以使用ls -F快速了解队列状态。

"文件扩展名"日志文件实际上是PID,因此您可以轻松杀死作业。在作业开始之前,它是nq的PID,因此您也可以通过杀死它来取消排队的作业。

由于日志文件中有最初的exec行,因此您可以通过将其作为shell命令文件执行来重新提交作业,即运行sh $ jobid。

您可以使用nq -w等待作业完成,可能会列出您要等待的作业ID。默认是所有这些。同样,您可以使用-t测试是否有需要等待的作业。

默认情况下,作业ID是按目录的,但是您可以将$ NQDIR设置为将其放置在其他位置。鼓励创建nq包装器,将$ NQDIR设置为提供用于不同目的的不同队列。

所有这些操作花费的最坏情况是二次生成的锁定文件数量,因此您应该定期清理它们。

%nq make clean%nq makedepend%nq make all%fq ...查看输出,可以随时用C-c中断而无需停止构建...

%mkdir -p / tmp / downloads%别名qget =' NQDIR = / tmp / downloads nq wget'%别名qwait =' NQDIR = / tmp / downloads fq -q' window1%qget http://mymirror/big1.isowindow2% qget http://mymirror/big2.isowindow3% qget http://mymirror/big3.iso% qwait ...等待所有下载完成...

作为nohup替换(基准测试将在后台运行,每个运行都会获取一个不同的输出文件,并且您运行的命令行也会记录在日志中。):

%ssh remoteremote%nq ./run-benchmark,14f6f3034f8.17035remote% ^ D%ssh remoteremote%fq ...查看输出,完成工作后fq退出...

gettimeofday表现为单调(使用CLOCK_MONOTONIC将创建令人困惑的文件名)。由于竞赛条件,其他工作顺序可能会很混乱,并且多个任务可能一次运行。

fq输出当前正在运行的作业的日志,在作业完成时退出。如果没有作业正在运行,则显示最后一个作业的输出。 fq -a显示所有作业的输出,fq -q仅显示每个作业一行。 fq在Linux上使用inotify,然后回退到轮询以更改大小。 (fq.sh是一个类似的工具,但功能不强于shell脚本调用tail。)

tq包装nq并在新的tmux或屏幕窗口中显示fq输出。

(nq的纯外壳实现以nq.sh的形式提供。它需要util-linux中的flock,并且计时器分辨率仅为1s。nq和nq.sh的锁文件不应混合使用。)

使用make all进行构建,make install相对于PREFIX(默认为/ usr / local)进行安装。遵循DESTDIR约定。您也可以将二进制文件复制到PATH中。

如果已安装Perl证明,则可以使用make check运行简单的测试套件。 在指定时间运行作业。 当系统负载水平允许时,批量运行作业。 nq按顺序运行作业,而不考虑系统的平均负载。 at和batch具有52个内置队列:a-z和A-Z。任何目录都可以是nq的队列。 语法是不同的:at和batch从标准输入或文件中提取整个脚本; nq将单个命令作为其命令行参数。 Leah Neukirchen [email protected]在法律允许的范围内,放弃了此作品的所有版权和相关的邻接权。