推荐开源项目:nq — 轻量级任务队列工具
项目地址:https://gitcode.com/leahneukirchen/nq
项目介绍
nq
是一个简单而强大的命令行工具,它允许您创建无需设置、维护或长期运行进程的轻量级任务队列系统。这个工具在多种操作系统上都能运行,包括 Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X 和 SmartOS 等。
其设计初衷是用于临时性的任务排队,比如 Makefile 的多个目标构建、逐个下载文件、多配置的基准测试,甚至可以作为 nohup
的替代品。但它的灵活性使你可以将它应用到各种场景中。
项目技术分析
nq
使用了 flock(2)
实现文件锁来保证任务顺序。每个任务都有一个与时间戳关联的输出文件(形如 ,TIMESTAMP.PID
),新任务只有在所有前面的任务完成并解锁后才会开始。由于锁是基于文件句柄的,因此在子进程中(即实际执行任务的进程)即使执行了 exec(2)
,锁也会保持到文件关闭(通常是在任务结束时)。这种方法确保了严格的排他性执行。
此外,nq
尝试确保当前正在运行的任务的日志文件具有可执行权限,这样你可以通过 ls -F
快速查看队列状态,并使用日志文件的进程ID(PID)直接杀死任务。利用初始 exec
行,您还可以通过执行该文件作为shell命令重新提交任务。
项目及技术应用场景
以下是一些使用示例:
-
并发编译: 在不同终端窗口依次输入
nq make clean
,nq make depends
,nq make all
,然后运行fq
查看编译进度,即使中断fq
也不会停止编译。 -
多终端下载管理: 创建一个
/tmp/downloads
目录,设定别名qget='NQDIR=/tmp/downloads nq wget'
和qwait='NQDIR=/tmp/downloads fq -q'
,然后在不同的终端窗口中使用qget
下载文件,使用qwait
等待所有下载完成。 -
后台运行程序: 通过 SSH 登录远程服务器,然后运行
nq ./run-benchmark
,当前任务会立即后台执行,日志会被记录,即使你断开连接,也可以再次登录检查结果。
项目特点
- 轻量级:无需额外守护进程或长时间运行的服务。
- 任务顺序:基于时间戳的严格执行顺序。
- 灵活的队列管理:支持目录级别的队列,也可自定义
$NQDIR
设置。 - 实时监控:通过
fq
工具实时查看任务输出,支持inotify
或者定时检查。 - 跨平台:兼容多种POSIX.1-2008合规的操作系统。
- 安全:通过文件锁和进程ID避免任务冲突。
nq
提供了一个直观且无侵入式的任务调度解决方案,无论是在日常开发还是自动化流程中,都值得尝试。如果您需要一个灵活、可靠并且易于管理的任务队列,那么 nq
绝对是一个很好的选择。现在就开始探索 nq
的无限可能性吧!