Busybox `timeout` 命令的返回状态

Busybox `timeout` 命令的返回状态

我正在编写一个 shell 脚本,该脚本应该在各种不同的发行版上运行,其中一些正在使用busybox,有些则没有。

该脚本使用该timeout命令来确定它执行的命令是否运行时间超过<time>或不超过。对于使用 的发行版来说,coreutils timeout这没有问题,因为当timeout必须终止命令时,它总是返回124,所以这很简单。

Alpine Linux我的问题是,当我在(使用 busybox )上运行相同的命令时,退出状态是0超时后必须终止该命令,但是当我在 Ubuntu 中使用包timeout中的命令时busybox,它会以143.

为什么这两个timeout命令(都来自busybox)给我不同的返回值?

是否有任何一致性或规则可以用来确定命令是否超时?

答案1

Alpine Linux 可能有早期版本的 busybox。一个简单的解决方案是在原始命令中添加另一个命令,该命令具有一些您可以测试的副作用,例如将一些输出写入 stdout 或文件。

例如,假设您希望原始命令的超时为 1 sleep 2,而不是

timeout 1 sleep 2

ok=$(timeout 1 bash -c 'sleep 2; echo ok')

并测试$ok是否正常。显然,如果您的命令写入 stdout,您需要重定向它,例如将其复制到 fd 3 并重定向到该位置:

exec 3>&1
ok=$(timeout 1 bash -c 'my command >&3; echo ok')
exec 3>&-

或将其echo ok写入文件中。

相关内容