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

x33g5p2x  于 2023-06-21  发布在  Linux
关注(0)|答案(3)|浏览(131)

这是我的第一个Bash脚本。我的Debian机器有WiFi问题。我不是来问原因的,而是如何在Bash的问题上贴创可贴。我的WiFi会在随机时间掉线,通常每12-15分钟一次。我在这台服务器上使用SSH,不想从物理服务器手动运行ifdown wlan0ifup wlan0(重新连接WiFi)。
这个Bash脚本的功能是尝试连接三次。如果失败三次,它就会给予。否则,每隔三秒,它会通过尝试ping谷歌来检查我的服务器是否连接。

#!/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

我已经隔离了这个脚本的问题。它在于用watch调用connection_test_loop函数。我一直无法找到任何信息,为什么这不是按预期执行,每三秒运行一次函数。

mi7gmzs6

mi7gmzs61#

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

如果你的函数有一些参数,请确保你用引号括起函数调用和这些参数,例如:

watch -x bash -c "connection_test_loop my_arg1 my_arg2"
70gysomp

70gysomp2#

我有多个别名和函数,它们过去不能与watch一起工作,直到我创建了一个像这样 Package watch命令的函数,灵感来自@l'L 'l accepted answer:

# fishshell
function watch
    command watch -n 0.2 -x fish -c "$argv"
end

# bash
function watch() {
    watch -n 0.2 -x bash -c "$@"
}

# zsh
watch() {
    watch -n 0.2 -x zsh -c "$@"

}

我在这里看到的唯一不方便的地方是,如果你想传递更多的watch参数,你不能传递更多的watch参数,当然我添加了-n 0.2标志,使它每0.2秒刷新一次,如果你有其他你想添加的标志,你需要提前在这里添加它们。
就我个人而言,我只使用fishshell,所以我希望其他人没有被打破,不要犹豫,编辑答案,以修复命令!
也作为经常使用手表的懒惰者的奖励:alias w=watch

ppcbkaq5

ppcbkaq53#

在@ I 'L'l的响应上,我写了这个代码,只是把所有函数导出到子shell,然后就收工了。注意,正则表达式需要这样声明的函数:my_function ();当然,您可以根据需要对其进行定制(例如,I egrep -v所有与nvm相关的函数)。

watch() {
  for i in $( declare -pf | egrep '^[A-Za-z0-9_]+ \(\)' | awk '{ print $1 }' ) ; do
    export -f $i
  done
  command watch "$@"
}

相关问题