Linux 超时命令和退出代码

Jad*_*zia 7 linux bash shell timeout

在 Linux shell 脚本中,如果达到某个时间限制,我想使用timeout命令来结束另一个命令。一般来说:

timeout -s SIGTERM 100 command
Run Code Online (Sandbox Code Playgroud)

但我也希望我的 shell 脚本在命令由于某种原因失败时退出。如果命令失败得足够早,则不会达到时间限制,超时将以退出代码 0 退出。因此无法使用trapset -e捕获错误,至少我已经尝试过了,但它不起作用。我怎样才能实现我想做的事?

cod*_*ter 9

你的情况不是很清楚,因为你没有在帖子中包含你的代码。

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)
Run Code Online (Sandbox Code Playgroud)

来自man timeout

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


请参阅BashFAQ105以了解set -e.