我需要在 bash 脚本中运行一个命令,并在运行时间过长时终止它。我还需要捕获变量的所有输出。如果命令首先完成,我需要释放/终止看门狗进程(例如睡眠),因为我可能会运行此类命令的列表。
不幸的是,“超时”命令对我来说不可用,否则我可以这样做:
output=`timeout -s 9 $TIMEOUT my-command`
并检查退出代码 124 以查看是否超时。
因此我选择的解决方案是由 @Dmitry 提出类似问题 https://stackoverflow.com/questions/687948/timeout-a-command-in-bash-without-unnecessary-delay:
( my_command ) & pid=$!
( sleep $TIMEOUT && kill -HUP $pid ) 2>/dev/null & watcher=$!
wait $pid 2>/dev/null && pkill -HUP -P $watcher
不幸的是,以下内容没有捕获 $output 的任何内容:
( output=`my_command` ) & pid=$!
我可以将输出转储到文件中,然后将其加载到变量中,如下所示,但我宁愿不使用文件:
( `my_command >$outfile` ) & pid=$!
...
output=`cat $outfile`
rm -f $outfile
我的问题:有更好的方法吗?理想情况下,在不使用文件的情况下将 stderr 捕获到另一个变量?
幸运的是,$()
表示法允许多个命令,因此您可以这样做:
output=$(
( my_command ) & pid=$!
( sleep $TIMEOUT && kill -HUP $pid ) 2>/dev/null & watcher=$!
wait $pid 2>/dev/null && pkill -HUP -P $watcher
)
您也可以使用常规()
对命令进行分组,然后重定向其所有输出。可以使用以下命令将 stderr 重定向到 stdout2>&1
,所以你最终会得到这样的结果:
output=$(
(
( my_command ) & pid=$!
( sleep $TIMEOUT && kill -HUP $pid ) 2>/dev/null & watcher=$!
wait $pid 2>/dev/null && pkill -HUP -P $watcher
) 2>&1
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)