#pipeline #process #pipe #unix #signal #plumber #system

app plumber-cli

简化Unix进程管道操作

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 命令行工具

Download history 26/week @ 2024-07-02

每月79次下载

MIT 许可证

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