1 个稳定版本
1.0.0 | 2021 年 6 月 1 日 |
---|
#42 在 #sleep
14KB
237 行
lockpipes - 无承诺的 sleep 替代方案
这是什么?
LockPipe
是一个命名管道,用作同步机制。 lockpipes
是一个用于这些的库,而 lockpipe
是该库主部分的 CLI。
为什么存在这个工具?
为了防止 Kubernetes 上的单次 DaemonSet
在我想要它们重启之前重启。
调用 sleep
是一种承诺。你是在告诉系统“不要为我调度这么长时间”。为了提前退出,你可以注册信号处理程序或在较短的睡眠间隔内循环。
在 Kubernetes 中,还需要考虑 terminationGracePeriodSeconds
(默认 30 秒)。如果睡眠间隔较长,那么宽限期就变成了重启 Pod
所需的时间。
在有 DaemonSet
和一定数量的节点的情况下,这可能导致非常长的滚动重启。这反过来使得增量更改变得更加繁琐。
在其他上下文中,阻塞读取 STDIN 是一种选择。但是 Kubernetes 会关闭这个流。
创建一个管道并从中读取是可行的,但你需要处理关闭它的事情。
这个工具(以及如果你喜欢这种类型的东西,库)为你管理这些东西提供了所有你需要的东西。
如何获得这个令人惊叹的工具?
$ cargo install lockpipes
如何使用它?
lockpipe
命令有一组子命令,用于生命周期的每个阶段(创建 -> 读取 -> 写入 -> 删除)。
大多数情况下,你只需要两个命令: read
和 write
。两个命令都检查管道是否存在,如果需要则创建它。但都不删除任何内容。
所有子命令都接受一个 --path
参数,并从 LOCKPIPE_PATH
环境变量中读取。这指定了管道的路径。
为了简洁起见,下面的示例假设以下环境
LOCKPIPE_PATH=example.pipe
LOCKPIPE_LOG_FILTER=debug
要从管道中读取(如果没有写者则阻塞),请调用 read
$ lockpipe read
[DEBUG lockpipes] ensuring pipe exists at "example.pipe"
[INFO lockpipes] pipe exists at "example.pipe"
[DEBUG lockpipes] reading from pipe at "example.pipe"
要将数据写入管道(如果没有读者则阻塞),请调用 write
$ lockpipe write
[DEBUG lockpipes] ensuring pipe exists at "example.pipe"
[INFO lockpipes] pipe exists at "example.pipe"
[DEBUG lockpipes] writing to pipe at "example.pipe"
在简单的情况下,通常不关心哪个端读取或写入。它只写入空字符串,并丢弃所有读取的数据。对于其他场景,任一端可能更有用,例如等待某物开始。
如果你要执行复杂的事情,手动处理某些部分可能是有帮助的。
使用create
创建一个管道。如果成功创建管道或指定路径已存在,则退出状态为0。如果发生错误,则退出状态不为0。
$ lockpipe create
[DEBUG lockpipes] creating pipe at "example.pipe"
[INFO lockpipes] created pipe at "example.pipe"
使用exists
检查管道是否存在。如果管道存在,则退出状态为0;如果不存在,则退出状态为1;如果发生错误,则退出状态为其他非零值。
$ lockpipe exists
[DEBUG lockpipes] checking if pipe exists at "example.pipe"
[INFO lockpipes] pipe exists at "example.pipe"
使用delete
删除管道。如果删除指定路径下的内容(或内容不存在),则退出状态为0。如果发生错误,则退出状态不为0。
$ lockpipe delete
[INFO lockpipes] deleted pipe at "example.pipe"
其他退出状态
在每种情况下,如果发生错误,退出状态应与某些errno
值对应。具体值取决于平台和问题。它还会记录一个error
,其中包含对问题的更易读的解释。
环境变量
名称 | 默认值 | 示例 | 描述 |
---|---|---|---|
LOCKPIPE_PATH | /run/forever | /path/to/lock.pipe | 设置管道的路径 |
LOCKPIPE_LOG_FILTER | info | error, warn, info, debug, trace. | 配置日志过滤 |
LOCKPIPE_LOG_STYLE | auto | auto, always, never. | 配置日志样式 |
许可证
lockpipes
在MIT许可证下提供,详见LICENSE.txt
全文。
依赖
~7–16MB
~195K SLoC