rep*_*lay 5 shell coreutils busybox timeout alpine-linux
我正在编写一个 shell 脚本,它应该可以在各种不同的发行版上运行,其中一些正在使用busybox
,有些没有。
此脚本使用timeout
命令来确定它执行的命令是否运行时间更长<time>
。在使用coreutils
timeout
this的发行版的情况下,这没有问题,因为当timeout
不得不终止一个命令时,它总是返回124
,所以这很简单。
我的问题是,当我在Alpine Linux
(使用 busybox )上运行相同的程序时,退出状态是0
超时后必须终止命令,但是当我在 Ubuntu 中使用包中的timeout
命令时,busybox
它以143
.
为什么timeout
这两个来自 的命令busybox
给了我不同的返回值?
是否有任何一致性或规则可以用来确定命令是否超时?
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
写入文件中。