bash - 错误或超时关闭脚本[重复]
Posted
技术标签:
【中文标题】bash - 错误或超时关闭脚本[重复]【英文标题】:bash - close script by error or by timeout [duplicate] 【发布时间】:2020-08-24 03:43:24 【问题描述】:在 *** 上有很多解决方案 - 如何通过超时关闭脚本或在出现错误时关闭脚本。 但是如何将这两种方法结合在一起呢? 如果在执行脚本期间出现错误 - 关闭脚本。 如果超时 - 关闭脚本。
我有以下代码:
#!/usr/bin/env bash
set -e
finish_time=$1
echo "finish_time=" $finish_time
(./execute_something.sh) & pid=$!
sleep $finish_time
kill $pid
但是如果在执行过程中出现错误 - 脚本仍然在等待,超时就会结束。
【问题讨论】:
所以wait
在孩子身上,有一个超时。如果您等待的时间较短,那么finish_time
并且孩子的退出状态为零,然后等到finish_time
。如果子状态不为零,则退出并出错。如果您wait
ed 时间过长并且超时,请执行其他操作。
如果您使用的是现代 Linux(使用 GNU coreutils),您将有一个 timeout
命令为您完成所有这些工作。运行 timeout "$finish_time" ./execute_something.sh
就可以了。
【参考方案1】:
首先,我不会使用set -e
。
你会明确地等待你想要的工作; wait
的退出状态将是作业本身的退出状态。
echo "finish_time = $1"
./execute_something.sh & pid=$!
sleep "$1" & sleep_pid=$!
wait -n # Waits for either the sleep or the script to finish
rv=$?
if kill -0 $pid; then
# Script still running, kill it
# and exit
kill -s ALRM $pid
wait $pid # exit status will indicte it was killed by SIGALRM
exit
else
# Script exited before sleep
kill $sleep_pid
exit $rv
fi
这里有一个轻微的竞争条件;它是这样的:
wait -n
在sleep
退出后返回,表示脚本会自行退出
脚本在我们检查它是否仍在运行之前退出
因此,我们假设它实际上是在睡眠之前退出的。
但这只是意味着我们将创建一个运行略微超过阈值的脚本,以按时完成。这可能不是您关心的区别。
理想情况下,wait
会设置一些 shell 参数来指示哪个进程导致它返回。
【讨论】:
以上是关于bash - 错误或超时关闭脚本[重复]的主要内容,如果未能解决你的问题,请参考以下文章
调查 000 从 bash 脚本中的 cURL 返回错误代码的原因 [重复]
Bash 脚本:如何确保脚本在使用“或”(||) 条件调用的函数中出现任何错误时退出?
awk:第 1 行:在或附近出现语法错误,需要一些 bash 帮助 [关闭]
蓝牙连接错误:“jnius.jnius.JavaException:发生 JVM 异常:读取失败,套接字可能关闭或超时,读取 ret:-1”