我在 debian 上使用超时功能来等待我的脚本 5 秒。效果很好,但我遇到的问题是我需要一个返回值。比如 1 表示超时,0 表示不超时 我该怎么做?
看看我的代码:
timeout 5 /some/local/script/connect_script -x 'status' > output.txt
# here i need the return of timeout
正如您所看到的,我的 connect_script -x 'status' 将状态作为字符串返回并将其打印到屏幕上(可能您看不到这一点)此问题的背景是,如果服务器(对于 connect_script)冻结,则脚本不执行任何操作。这就是为什么我需要超时。当超时时我想重新启动服务器。我可以做到这一点,但我不知道如何查看它是否超时......
答案1
如果timeout
超时,则退出状态 124;您可以检查此以确定脚本是否超时。
答案2
根据手册( man timeout
):
概要超时 [选项] 数字[后缀] 命令 [ARG]...
[...] 如果命令超时,则以状态 124 退出。否则,以 COMMAND 状态退出
将其与退出状态或返回值存储在变量 中的知识相结合,$?
我们有......
timeout 5 /some/local/script/connect_script -x 'status' > output.txt
RETVAL=$?
然后,您可以根据 的值进行更多处理$RETVAL
,如果超时,该值将是 124,或者基于 的退出状态的其他值connect_script
。
答案3
返回值timeout
取决于您用来终止子进程的信号。
SIGTERM
返回 124:
timeout -s SIGTERM 1 sleep 2; echo $?
但SIGKILL
返回 137:
timeout -s SIGKILL 1 sleep 2; echo $?
请参阅手册页:
如果命令超时,并且未设置 --preserve-status,则以状态 124 退出。否则,以 COMMAND 状态退出。如果未指定信号,则在超时时发送 TERM 信号。 TERM 信号会终止任何不阻止或捕获该信号的进程。可能需要使用 KILL (9) 信号,因为该信号无法被捕获,在这种情况下退出状态为 128+9 而不是 124。