bash - 在设定的超时后终止一个子进程

bash - 在设定的超时后终止一个子进程

问题描述:

我希望有人能够帮我解决这个问题 我需要一个shell脚本的循环来运行循环中的内容15秒。所以例如bash - 在设定的超时后终止一个子进程

if (true) 
    run command for 15 seconds 
fi 
    kill PID 

我是新的shell脚本,所以我失去了这一点。 另外我使用的是Debian instll如果让任何区别

任何帮助表示赞赏

+0

参见[猛砸http://*.com/questions/526782/how-do-i-limit-the-running-time-of-a-bash-script/526815#526815 – paxdiablo 2012-04-23 08:45:12

+1

可能重复在给定的超时后杀死子进程的脚本](http://*.com/questions/5161193/bash-script-that-kills-a-child-process-after-a-given-timeout) – 2012-04-23 15:53:16

您正在寻找的timeout命令?

+0

我试过使用但我不能让它工作我也试过使用ping -c 15 127.0.0.1 – AlanF 2012-04-23 09:32:03

+0

'timeout 15 command'? – huon 2012-04-23 09:34:01

+0

@AlanF:你在说ping吗?你试过'ping -w1 -c15 127.0.0.1'吗?或者ping只是一个例子? – 2012-04-23 16:56:49

下面的bash脚本可能适合你。该脚本将在开始循环之前将初始时间点设置为变量。当循环运行时,一个额外的变量将被设置为当前的历元时间。两个时代将进行比较,只要差异小于或等于15,您的命令将继续运行。请注意,在下面的脚本中,当前运行的命令是'echo',计数$ {COUNTER}“'。您应该更改脚本的这一部分以匹配您正在尝试完成的内容。一旦两个时代的差异大于15,剧本将退出。此时您需要启动kill命令。如果发生错误,您应该在“YourLogFile”中看到“ERROR ... YourScript.sh失败”(将您的日志文件设置为所需内容)

注意:无论您在此循环中尝试运行在15秒内跑很多次。通过使用下面的脚本作为测试,您将看到echo命令每秒运行超过50次。

#!/bin/bash 

LOOP="true" 
INITIAL_TIME=$(date "+%s") 

while [[ ${LOOP} == true ]]; do 

    CURRENT_TIME=$(date "+%s") 
    COUNTER=$(expr ${CURRENT_TIME} - ${INITIAL_TIME}) 

    if [[ ${COUNTER} -le "15" ]]; then 

     echo "counting ${COUNTER}" 
     # RUN YOUR COMMAND IN PLACE OF THE ABOVE echo COMMAND 

    elif [[ ${COUNTER} -gt "15" ]]; then 
     exit 0 
      #INITIATE YOUR KILL COMMAND IN PLACE OF OR BEFORE THE exit 
    else 
     echo "ERROR... YourScript.sh failed" >> /YourLogFile 
    fi 

done 
+0

这个命令替换'echo'计数$ {COUNTER}“'会阻塞并且不终止 - 比如通过慢速连接下载一个长视频。 – 2012-04-23 16:55:17