7 个不稳定版本 (3 个破坏性更新)
0.4.1 | 2023年12月7日 |
---|---|
0.3.3 | 2023年10月12日 |
0.2.2 | 2023年10月10日 |
0.1.1 | 2023年10月7日 |
#751 in 命令行工具
每月79次下载
23KB
489 行
plumber
简化Unix进程管道操作
本项目旨在使用Unix操作系统的标准工具创建简单、模块化和强大的管道。
pull_from_stream|transformer_1|transformer_2|transformer_3|push_to_stream
Shell用户可能会认识并使用的进程管道语言,并问为什么还要使用plumber呢?
plumber的目的确保管道在重启和中断时仍能稳健运行,可以通过文件轻松定义和管理(用于IaC场景),并且高度可配置。
功能
- 模块化管道构建
- 健壮的信号处理
- 极其简单的实现
行为
- 管道意味着将stdout重定向到下一个程序的stdin
- plumber run默认将stderr日志记录到
/tmp/plumber/log/<plumber文件名>/<cmd>.stderr.log
- 将捕获终止信号,将其发送到管道中的第一个程序,并等待其完成
示例
使用管道创建测试文件
echo "exec = 'tail -n 100 -f /usr/share/dict/words | grep a | wc'" > test_pipeline.plumb
使用 plumber run <PATH>
运行管道
plumber run test_pipeline.plumb
[2023-12-07T19:31:43Z INFO plumber::pipeline] (test_pipeline) executing pipeline: 'tail -n 100 -f /usr/share/dict/words | grep a | wc'
[2023-12-07T19:31:43Z INFO plumber::pipeline] (test_pipeline) logging command stderr to: '/tmp/plumber/log/test_pipeline/*.stderr.log'
[2023-12-07T19:31:43Z INFO plumber::pipeline] (test_pipeline) pid of first job in pipeline is: 30251
[2023-12-07T19:31:43Z INFO plumber::pipeline] (test_pipeline) gracefully stop pipeline with: 'plumber stop test_pipeline'
使用 plumber stop <NAME>
或在主进程窗口中按Ctrl+C优雅地停止管道
^C[2023-12-07T19:31:57Z INFO plumber::pipeline] (test_pipeline) exiting gracefully...
最后一条命令的stdout流到plumber的stdout,允许管道链式操作。在这个例子中,我们看到wc命令的输出
28 28 334
在 /tmp/plumber/log/test_pipeline/tail.stderr.log, grep.stderr.log, wc.stderr.log
中找到stderr日志
尝试通过常规shell重新运行管道并按Ctrl+C。
tail -n 100 -f /usr/share/dict/words | grep 'a' | wc
注意,因为没有命令被正确执行,所以没有输出。使用Plumber,您可以确信中间过程缓冲区中的数据不会像这样丢失。
模块
在几乎任何编程语言中构建管道的模块/转换器/过程都很简单(当然,性能取决于程序员)。您需要的只是一个从stdin读取、进行转换并向stdout输出的程序。
注意:对于管道中的第一个过程,它需要以负责任的方式处理SIGTERM和SIGINT。
守护进程化
使用系统守护进程/服务管理器来守护进程化Plumber管道。以下是一个systemd单元文件的示例:
[Unit]
Description=Example Plumber Pipeline
[Service]
Environment=RUST_LOG=debug
ExecStart=plumber run /opt/plumber-example
ExecStop=plumber stop /opt/plumber-example
User=plumber
Restart=always
[Install]
WantedBy=default.target
依赖
~6–15MB
~191K SLoC