【问题标题】:bash - killing a subprocess after a set timeoutbash - 在设置超时后杀死一个子进程
【发布时间】:2012-05-03 21:00:16
【问题描述】:

我希望有人能够帮助我解决这个问题 我需要一个 shell 脚本的循环,它将运行循环内的内容 15 秒。所以例如

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

我是 shell 脚本的新手,所以我对此感到迷茫。 如果这有什么不同,我也正在使用 debian instll

感谢任何帮助

【问题讨论】:

标签: bash shell debian


【解决方案1】:

您在寻找timeout 命令吗?

【讨论】:

  • 我尝试使用它,但我无法让它工作我也尝试使用 ping -c 15 127.0.0.1
  • @AlanF:你说的是 ping?你试过ping -w1 -c15 127.0.0.1 吗?还是 ping 只是一个例子?
【解决方案2】:

以下 bash 脚本可能适合您。该脚本将在开始循环之前将初始纪元时间设置为变量。在循环运行时,将使用当前纪元时间设置一个附加变量。将比较两个纪元时间,只要差异小于或等于 15,您的命令将继续运行。请注意,在下面的脚本中,当前正在运行的命令是 'echo "counting ${COUNTER}"'。您应该更改脚本的这一部分以匹配您要完成的任务。一旦两个 epoch 时间之差大于 15,脚本将退出。此时您将需要启动您的 kill 命令。如果确实发生错误,您应该在“YourLogFile”中看到“ERROR...YourScript.sh failed”(将您的日志文件设置为您想要的)

注意:无论您在此循环中尝试运行什么,都可能在 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

【讨论】:

  • 替换 echo "counting ${COUNTER}" 的命令将阻止而不是终止 - 比如说通过慢速连接下载长视频。
猜你喜欢
  • 2011-07-06
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 2016-01-24
  • 2019-12-09
相关资源
最近更新 更多