使用"观看"在Bash中重复运行一个函数?

时间:2016-01-26 02:04:59

标签: linux bash function command watch

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

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

ifup wlan0

我已经分离了我对此脚本的问题。它在于使用#!/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函数。我一直无法找到任何关于为什么它没有按预期执行并且每三秒运行一次功能的信息。

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:0)

我有多个别名和函数,这些别名和函数过去不能与 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 所以我希望其他的没有坏,不要犹豫,编辑答案以修复命令!

也给经常使用 watch 的懒人加分:alias w=watch