【问题标题】:Using "watch" to run a function repeatedly in Bash?使用“watch”在 Bash 中重复运行一个函数?
【发布时间】:2016-05-02 13:09:34
【问题描述】:

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

这个 Bash 脚本的作用是尝试连接 3 次。如果它失败了三遍,它就会放弃。否则,它会每三秒通过尝试 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

我已经隔离了我在使用此脚本时遇到的问题。在于用watch调用connection_test_loop函数。我一直找不到任何信息说明为什么它没有按预期执行并且每三秒运行一次函数。

【问题讨论】:

    标签: linux bash function command watch


    【解决方案1】:

    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
    

    【讨论】:

    • export -f function-name 在 ubuntu 服务器 16.04 上不适合我 - 你有什么想法吗?
    • 只有 watch -x bash -c my-func 在 Ubuntu Server 16.04 上为我工作 - 而其他人则不能。
    【解决方案2】:

    我有多个别名和函数,这些别名和函数过去不能与 watch 一起使用,直到我创建了一个像这样包装 watch 命令的函数,灵感来自 @l'l'l 接受的答案:

    # 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 "$@"
    
    }
    

    我在这里看到的唯一不便之处是,如果你愿意,你不能传递更多的观察参数,当然我添加了-n 0.2 标志,让它每 0.2 秒刷新一次,如果你有其他你喜欢的标志要添加,您需要事先在此处添加它们。

    我个人只使用fishshell,所以希望其他的不要坏,不要犹豫编辑答案来修复命令!

    对于经常使用手表的懒人来说也是一个奖励:alias w=watch

    【讨论】:

      猜你喜欢
      • 2016-04-22
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      • 2015-06-02
      相关资源
      最近更新 更多