Busybox `timeout` 命令的返回状态

rep*_*lay 5 shell coreutils busybox timeout alpine-linux

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

此脚本使用timeout命令来确定它执行的命令是否运行时间更长<time>。在使用coreutils timeoutthis的发行版的情况下,这没有问题,因为当timeout不得不终止一个命令时,它总是返回124,所以这很简单。

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

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

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

meu*_*euh 3

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

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

timeout 1 sleep 2
Run Code Online (Sandbox Code Playgroud)

ok=$(timeout 1 bash -c 'sleep 2; echo ok')
Run Code Online (Sandbox Code Playgroud)

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

exec 3>&1
ok=$(timeout 1 bash -c 'my command >&3; echo ok')
exec 3>&-
Run Code Online (Sandbox Code Playgroud)

或将其echo ok写入文件中。