使用“watch”在Bash中重复运行一个函数?

问题描述 投票:4回答:1

这是我的第一个Bash脚本。我的Debian机器有WiFi问题。我不是在这里询问原因,而是如何在Bash的问题上设置一个创可贴。我的WiFi将随机退出,通常每12-15分钟一次。我在这台服务器上使用SSH,并且不希望从物理服务器手动运行ifdown wlan0ifup wlan0(它重新连接WiFi)。

此Bash脚本的功能是尝试连接三次。如果它失败三次,它就会放弃。否则,每三秒钟它会通过尝试ping Google来检查我的服务器是否已连接。

#!/bin/bash

ATTEMPTS=1

function test_connection {
  ping -c 1 www.google.com
  local EXIT_CODE=$?
  if [ $EXIT_CODE -eq 0 ]
    then
      return true
    else
      return false
  fi
}
function reset_connection {
  ifdown wlan0
  ifup wlan0
  EXIT_CODE=$((EXIT_CODE+1))
}
function connection_test_loop {
  if [ $ATTEMPTS -ge  3 ]
    then
      echo CONNECTION FAILED TO INITIALIZE ... ATTEMPT $ATTEMPTS FAILED ... EXITING
      exit
  fi
  if ! [ test_connection ]
    then
      echo CONNECTION DROPPED ... ATTEMPTING TO RE-ESTABLISH CONNECTION ... ATTEMPT $ATTEMPTS
      reset_connection
  fi
}

test_connection
if [ $? ]
  then
    echo CONNECTION PRE-ESTABLISHED
    watch -n 3 connection_test_loop
  else
    echo CONNECTION FAILED TO INITIALIZE ... ATTEMPTING TO RESET CONNECTION ... ATTEMPT $ATTEMPTS
    reset_connection
    if [ $? ]
      then
        echo CONNECTION ESTABLISHED
        watch -n 3 connection_test_loop
      else
        echo CONNECTION FAILED TO INITIALIZE ... ATTEMPT $ATTEMPTS FAILED ... EXITING
        exit
    fi
fi

我已经分离了我对这个脚本的问题。它在于用connection_test_loop调用watch函数。我一直无法找到任何关于为什么没有按预期执行并且每三秒运行一次该功能的信息。

linux bash function command watch
1个回答
8
投票

watch可能不知道你的connection_test_loop函数。你可以尝试在test_connection下面添加一个export来解决这个问题:

test_connection
export -f connection_test_loop
...

http://linuxcommand.org/lc3_man_pages/exporth.html

调用watch时,您可能需要以下语法:

watch -x bash -c connection_test_loop
© www.soinside.com 2019 - 2024. All rights reserved.