有效地超时一个命令,并捕获输出到bash脚本中的variables

我需要运行一个命令,并在bash脚本中运行时间过长时将其杀死。 我也需要捕获所有输出到一个variables。 如果命令先完成,我需要释放/终止看门狗进程(例如睡眠),因为我可以运行这样的命令列表。

不幸的是,“超时”命令是不可用的,别的我可以做这样的事情:

output=`timeout -s 9 $TIMEOUT my-command` 

并检查退出代码124以查看是否有超时。

因此,我select的解决scheme是由@Dmitry提出一个类似的问题 :

 ( my_command ) & pid=$! ( sleep $TIMEOUT && kill -HUP $pid ) 2>/dev/null & watcher=$! wait $pid 2>/dev/null && pkill -HUP -P $watcher 

不幸的是,以下内容不会捕获任何$输出:

 ( output=`my_command` ) & pid=$! 

我可以转储输出到一个文件,然后像这样加载到variables,但我宁愿没有文件:

 ( `my_command >$outfile` ) & pid=$! ... output=`cat $outfile` rm -f $outfile 

我的问题是:还有更好的办法吗? 理想情况下捕获stderr以及另一个variables,而不使用文件?

幸运的是, $()符号允许多个命令,所以你可以这样做:

 output=$( ( my_command ) & pid=$! ( sleep $TIMEOUT && kill -HUP $pid ) 2>/dev/null & watcher=$! wait $pid 2>/dev/null && pkill -HUP -P $watcher ) 

您也可以使用regular ()来分组命令,然后重定向所有的输出。 将stderr重定向到标准输出可以使用2>&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 )