Linux的超时命令和退出代码

12
在Linux shell脚本中,我想使用timeout命令在达到一定时间限制时结束另一个命令。通常情况下:
timeout -s SIGTERM 100 command

但是我希望当命令由于某些原因而失败时,我的Shell脚本也能退出。如果命令失败得足够早,那么时间限制就不会达到,超时将以退出代码0退出。因此,错误无法通过trapset -e捕获,至少我已经尝试过了,但没有成功。我该怎么做才能实现我的目标?

1个回答

16

由于您未在帖子中包含代码,因此您的情况不是非常清楚。

timeout 如果在超时值之前完成,则会退出并返回命令的退出码。

例如:

timeout 5 ls -l non_existent_file
# outputs ERROR: ls: cannot access non_existent_file: No such file or directory
echo $?
# outputs 2 (which is the exit code of ls)

根据 man timeout:

如果命令超时,且未设置 --preserve-status,则以状态码 124 退出。否则,以 COMMAND 的状态码退出。如果没有指定信号,在超时时发送 TERM 信号。TERM 信号会杀死任何不阻塞或捕获该信号的进程。可能需要使用 KILL (9) 信号,因为该信号无法被捕获,在这种情况下,退出状态码是 128+9 而不是 124。


参见BashFAQ105了解 set -e 的陷阱。


1
非常感谢您的帮助性回答。我确实忽略了手册的这一部分。我会研究您关于 set -e 的注意事项提示。 - Jadzia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接