1 个稳定版本

1.0.0 2021 年 6 月 1 日

#42#sleep

MIT 许可证

14KB
237

lockpipes - 无承诺的 sleep 替代方案

这是什么?

LockPipe 是一个命名管道,用作同步机制。 lockpipes 是一个用于这些的库,而 lockpipe 是该库主部分的 CLI。

为什么存在这个工具?

为了防止 Kubernetes 上的单次 DaemonSet 在我想要它们重启之前重启。

调用 sleep 是一种承诺。你是在告诉系统“不要为我调度这么长时间”。为了提前退出,你可以注册信号处理程序或在较短的睡眠间隔内循环。

在 Kubernetes 中,还需要考虑 terminationGracePeriodSeconds(默认 30 秒)。如果睡眠间隔较长,那么宽限期就变成了重启 Pod 所需的时间。

在有 DaemonSet 和一定数量的节点的情况下,这可能导致非常长的滚动重启。这反过来使得增量更改变得更加繁琐。

在其他上下文中,阻塞读取 STDIN 是一种选择。但是 Kubernetes 会关闭这个流。

创建一个管道并从中读取是可行的,但你需要处理关闭它的事情。

这个工具(以及如果你喜欢这种类型的东西,库)为你管理这些东西提供了所有你需要的东西。

如何获得这个令人惊叹的工具?

$ cargo install lockpipes

如何使用它?

lockpipe 命令有一组子命令,用于生命周期的每个阶段(创建 -> 读取 -> 写入 -> 删除)。

大多数情况下,你只需要两个命令: readwrite。两个命令都检查管道是否存在,如果需要则创建它。但都不删除任何内容。

所有子命令都接受一个 --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