gpt4 book ai didi

bash - 在脚本中使用 `until` 和 `/usr/bin/timeout`

转载 作者:行者123 更新时间:2023-11-29 09:00:20 25 4
gpt4 key购买 nike

我想在 bash 脚本中执行大约需要 1 分钟才能完成的命令。然而,有时这个命令会挂起,所以我想在循环中使用/usr/bin/timeout 直到它起作用。

如果我使用 timeout 300 mycommand myarg1,它会起作用,但如果我在下面这个循环中的 bash 中使用它,它不会打印任何东西(甚至不会打印我的命令打印的典型输出)它挂了!:

until timeout 300 mycommand myarg
do
echo "The command timed out, trying again..."
done

我的 bash 版本:

$ bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

我的超时版本:

$ timeout --version
timeout (GNU coreutils) 8.25
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

(标准Ubuntu16.04)

最佳答案

问题

(mycommand args) & pid=$!
sleep 1000 && kill -INT $pid

是它总是需要 1000 秒。采取更积极(和 CPU 消耗)的方法将缩短该时间:

typeset -i i 
i=0
command with arguments &
pid=$!
while ps $pid > /dev/null 2>/dev/null ; do
i=$i+1
if [ $i -gt 999 ] ; then
kill -9 $pid
fi
sleep 1
done

或者,如果您的系统不太忙或间隔很短:

command with arguments &
pid=$!
echo "kill -9 $pid" | at "now + 15 minutes"
wait

但是 timeout 当然也可以。

原因

until timeout 300 mycommand myarg
do
echo "The command timed out, trying again..."
done

挂起是 bash 将尝试评估您的 until 的条件,这可能需要长达 300 秒。如果 timeout 300 mycommand myarg 返回成功,则 until 永远不会执行。尝试例如:

if timeout 30 mycommand myarg ; then
echo "The timeout of mycommand succeeded"
else
echo "It failed! What a pitty"
fi

关于bash - 在脚本中使用 `until` 和 `/usr/bin/timeout`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44679250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com