如果不满足某个条件,请尝试使用bash脚本超时

时间:2018-04-18 18:50:51

标签: bash

我正在尝试编写一个将执行的bash脚本,如果满足某个条件(grep),则脚本会退出,但如果在X秒内未找到grep,那么我'我喜欢它回应一些然后退出。最大的问题是其中一个命令是长时间运行的,我必须退出它,否则只是继续前进直到我关闭终端。

为了提供帮助,我们正在使用Pusher CLI https://pusher.com/docs/pusher_cli/documentation在现场对IoT设备进行ping操作。

为了让这个工作,我首先订阅该频道,然后进行后台处理,等待5秒然后发送ping。然后,我grep来自后台进程的输出,并在响应中查找“pong”,如果找到则退出。这一切都运行得很好,我遇到的问题是找不到“pong”(设备离线)并且订阅过程在后台无限期地保持运行而且我没有意识到设备处于脱机状态。

所以我想要一些可以触发命令的东西然后在10秒内杀死所有东西但是如果找到了“pong”那么就会杀死所有东西。

这是我到目前为止的脚本

ping () {
  subscribe_channel $1 &
  sleep 5
  ping_channel $1
}

ping_channel () {
  pusher channels apps trigger --app-id $appid --channel $1 --event $event --message $message
}

subscribe_channel () {
  while read -r line; do
    echo $line
    if [[ $(echo $line | grep "pong") ]]; then
      echo "online"
      exit
    fi
  done < <(pusher channels apps subscribe --app-id $appid --channel $1)
}

ping channel

1 个答案:

答案 0 :(得分:1)

您可以使用ping_channel运行timeout并在10秒后退出。

如果命令因超时而退出,则其返回码将为124,而不是0

这是一个例子:

timeout 1 sleep 10  # Try to sleep for 10 seconds but timeout after 1 second
echo $?  # Exits with a status of 124

timeout 2 sleep 1  # Sleep for 1 second, the timeout of 2 seconds is not hit
echo $?  # Exits with a status of 0

要在代码中使用此功能,请更改以下行:

pusher channels apps trigger --app-id $appid --channel $1 --event $event --message $message

为:

timeout 10 pusher channels apps trigger --app-id $appid --channel $1 --event $event --message $message
pusher_status=$?
if (( pusher_status == 124 )); then
    echo "ping_channel has timed out after 10 seconds"
fi

希望您可以使用上述代码来处理代码。

编辑:

某些Linux操作系统变种上预装了

timeout,但如果不是,则可能需要安装它。

如果您无法安装,那么以下BashFAQ上的一些解决方案可能有所帮助:BashFAQ068(感谢@CharlesDuffy)