dou*_*BTV 5 linux bash kill timeout
我有一个正在运行的主脚本,从中我有第二个“缓慢进程”我想开始,如果它没有在时间限制内完成,则在主脚本中“做某事”——取决于是否完成。注意,如果“缓慢过程”在我的时间限制之前完成,我不想等待整个时间限制。
我希望“缓慢的过程”继续进行,以便我可以收集有关其性能的统计数据和取证。
我已经研究过使用timeout,但是它会在完成后杀死我的脚本。
假设这个简化的例子。
主文件
result=`timeout 3 ./slowprocess.sh`
if [ "$result" = "Complete" ]
then
echo "Cool it completed, do stuff..."
else
echo "It didn't complete, do something else..."
fi
Run Code Online (Sandbox Code Playgroud)
慢进程.sh
#!/bin/bash
start=`date +%s`
sleep 5
end=`date +%s`
total=`expr $end - $start`
echo $total >> /tmp/performance.log
echo "Complete"
Run Code Online (Sandbox Code Playgroud)
在这里,它使用超时——所以脚本死了,所以没有任何结果/tmp/performance.log——我想slowprocess.sh完成,但是,main.sh即使它没有在 3 秒内完成,我也想继续下一步。
使用 ksh/bash/zsh:
{
(./slowprocess.sh >&3 3>&-; echo "$?") |
if read -t 3 status; then
echo "Cool it completed with status $status, do stuff..."
else
echo "It didn't complete, do something else..."
fi
} 3>&1
Run Code Online (Sandbox Code Playgroud)
我们将原始标准输出复制到 fd 3 ( 3>&1) 以便我们可以为slowprocess.sh( >&3)恢复它,而(...)子外壳其余部分的标准输出则进入到read -t 3.
或者,如果你想使用timeout(这里假设 GNU timeout):
timeout --foreground 3 sh -c './slowprocess.sh;exit'
Run Code Online (Sandbox Code Playgroud)
将避免slowprocess.sh被杀死(这;exit对于sh通过执行 shell 进程中的最后一个命令进行优化的实现是必要的)。
| 归档时间: |
|
| 查看次数: |
4391 次 |
| 最近记录: |