你好!有没有办法在使用 Bash 的脚本中包含一个定时器(时间戳?或其他术语)?例如:每60秒钟,一个特定的函数检查互联网是否断开连接,如果是,则连接到wifi设备,反之亦然。简而言之,该程序会定时检查互联网连接。
任何建议/答案将不胜感激。=)
简明版
while sleep 60; do
if ! check_internet; then
if is_wifi; then
set_wired
else
set_wifi
fi
fi
done
使用睡眠本身作为循环条件,可以通过终止睡眠来跳出循环(例如,如果它是前台进程,则可以使用Ctrl-C)。
如果我们讨论的是几分钟或几小时的时间间隔,cron可能会更好,正如Montecristo所指出的那样。
#!/bin/sh
route=`which route`
ip=`which ip`
# define your email here
mail="user@domain.tld"
# We define our pingable target like 'yahoo' or whatever, note that the host have to be
# reachable every time
target="www.yahoo.com"
# log file
file="/var/log/updown.log"
# your routers here
router1="192.168.0.1"
router2="192.168.0.254"
# default router
default=$($ip route | awk '/default/ { print $3 }')
# ping command
ping -c 2 ${target}
if [ $? -eq 0 ]; then
echo "`date +%Y%m%d-%H:%M:%S`: up" >> ${file}
else
echo "`date +%Y%m%d-%H:%M:%S`: down" >> ${file}
if [ ${default}==${router1} ]; then
${route} del default gw ${router1}
${route} add default gw ${router2}
elif [ ${default}==${router2} ]; then
${route} del default gw ${router2}
${route} add default gw ${router1}
fi
# sending a notification by mail or may be by sms
echo "Connection problem" |mail -s "Changing Routing table" ${mail}
fi
#!/bin/sh
someproc()
{
sleep $1
return $2
}
run_or_timeout()
{
timeout=$1
shift
{
trap 'exit 0' 15
"$@"
} &
proc=$!
trap "kill $proc" ALRM
{
trap 'exit 0' 15
sleep $timeout
kill -ALRM $$
} &
alarm=$!
wait $proc
ret=$?
# cleanup
kill $alarm
trap - ALRM
return $ret
}
run_or_timeout 0 someproc 1 0
echo "exit: $? (expected: 142)"
run_or_timeout 1 someproc 0 0
echo "exit: $? (expected: 0)"
run_or_timeout 1 someproc 0 1
echo "exit: $? (expected: 1)"
您可以尝试以下方法,但它并不可靠:
#!/bin/sh
trap handle_timer USR1
set_timer() { (sleep 2; kill -USR1 $$)& } handle_timer() { printf "%s:%s\n" "计时器已过期" "$(date)"; set_timer }
set_timer while true; do sleep 1; date; done
这种技术的一个问题是,陷阱只有在当前任务返回到shell后才会生效(例如,将sleep 1替换为sleep 10)。如果shell大部分时间都在控制下(例如,如果它调用的所有命令都会快速终止),那么这可能有效。当然,一种选择是将所有内容都在后台运行。