当互联网连接即将丢失时,如何运行脚本?

当互联网连接即将丢失时,如何运行脚本?

我将wvdial(PPP 拨号器)与 SIM 卡调制解调器一起使用,有时此连接会由服务器端重置。我想运行一个脚本,该脚本通过 grepifconfig获取下载的大量数据并将其存储在某个地方。显然,必须在连接仍然存在时完成,否则我什么也得不到,或者几秒钟后得到新连接的值,因为wvdial配置为在连接丢失时立即重新连接。任何想法?

编辑:

当然,我可以ifconfig每隔一两秒 grep 一次输出,但这是一个可怕的解决方法,甚至不值得考虑。我能想象的最好的场景是以某种方式捕获指示ifconfig“重置计数”=>暂停信号一会儿=>运行我的脚本=>解锁信号的信号。但也许还有其他我不知道的可能性,例如,ifconfig如果给定的界面消失,则将其自身配置为将先前的结果转储到文件中。另一种选择是不从其他地方获取输出ifconfig。顺便说一句,输入源是什么ifconfig

答案1

您可以编写自己的 shell 脚本,在 while(1) 循环内准确记录您想要的内容,并在最后调用 sleep 调用(或者您想要的任何睡眠长度)。像这样的东西:

function get_logname
  {
  echo `date +'%F-%H-%M-%S'`.log
  }

function am_online
  {
   ping -c 1 google.com  >/dev/null 2>&1
   echo $?
  }

function update_logfile
  {
  echo "YOUR DATA TO BE LOGGED" >> $1 
  }

  CUR_LOG=`get_logname`
  echo $CUR_LOG
  while [ 1 ]; do
        if [ "`am_online`" -eq 0 ]; then
           update_logfile $CUR_LOG
        else
           echo "we are offline!"
       CUR_LOG=`get_logname`
        fi

        sleep 1
  done

当您在线时,它每秒都会记录到您的日志文件中(>> 追加新数据,> 重写文件以仅包含新数据)。当您离线时,它会不断为下一个日志文件选择一个新名称,并且不记录任何内容。当您重新上线时,它开始使用上次选择的日志文件名登录新的日志文件,而其他日志文件保持不变。

这应该对你有用。与您在网上找到的所有代码一样,您有责任对其进行测试并确保它能够满足您的要求并且不会破坏任何内容。特别是在这种情况下,请注意日志文件的大小可能会很快膨胀,如果您经常离线,您可能会得到一堆日志文件。

保存为“my_internet_logging_script.sh”之类的文件并运行:

sh my_internet_logging_script.sh

在您希望日志文件(或相应地编辑脚本)出现的目录中。

答案2

回答你的最后一个问题:ifconfig阅读/proc/net/dev/proc/net/if_inet6。有关不同接口传输数据的信息可在第一个文件中找到。

/proc是一种特殊的文件系统,文件不存储在硬盘上,而是在每次要读取它们时由内核创建,因此对文件的访问速度非常快。此外,直接解析/proc/net/dev应该比解析快一点,ifconfig因为该命令会执行您不需要的不同操作。

只是为了给您一个粗略的概念,这里是 1000 次重复的时间ifconfigcat /proc/net/dev(重复是zsh命令):

$ time (repeat 1000 ifconfig > /dev/null)
1.14s user 3.85s system 90% cpu 5.513 total
$ time (repeat 1000 cat /proc/net/dev > /dev/null)
0.57s user 2.44s system 70% cpu 4.282 tota

当然解析/proc/net/dev还不是好的解决方案,但至少您可以提高 20-30% 的速度,毕竟您决定每秒解析输出。

相关内容