在 Bash 中重复使用 "watch" 到 运行 一个函数?
Using "watch" to run a function repeatedly in Bash?
这是我的第一个 Bash 脚本。我的 Debian 机器有 WiFi 问题。我不是来这里问原因的,而是如何在 Bash 的问题上贴上创可贴。我的 WiFi 会随机中断,通常每 12-15 分钟一次。我在此服务器上使用 SSH,并且不想从物理服务器手动 运行 ifdown wlan0
和 ifup 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
函数。我一直无法找到任何信息来说明为什么它没有按预期执行并且 运行 每三秒执行一次该功能。
可能 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
一起使用,直到我创建了一个像这样包装 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
这是我的第一个 Bash 脚本。我的 Debian 机器有 WiFi 问题。我不是来这里问原因的,而是如何在 Bash 的问题上贴上创可贴。我的 WiFi 会随机中断,通常每 12-15 分钟一次。我在此服务器上使用 SSH,并且不想从物理服务器手动 运行 ifdown wlan0
和 ifup 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
函数。我一直无法找到任何信息来说明为什么它没有按预期执行并且 运行 每三秒执行一次该功能。
可能 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
一起使用,直到我创建了一个像这样包装 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