【问题标题】:How to include a timer in Bash Scripting?如何在 Bash 脚本中包含计时器?
【发布时间】:2009-08-04 07:27:04
【问题描述】:

美好的一天!有没有办法使用 bash 在脚本中包含计时器(时间戳?或任何术语)?比如说;每 60 秒,一个特定的功能会检查互联网是否关闭,如果是,则它会连接到 wifi 设备,反之亦然。简而言之,该程序会不时检查互联网连接。

任何建议/答案将不胜感激。 =)

【问题讨论】:

    标签: bash timestamp


    【解决方案1】:

    钝版

    while sleep 60; do
      if ! check_internet; then
        if is_wifi; then
           set_wired
        else
           set_wifi
        fi
      fi
    done
    

    将睡眠本身用作循环条件允许您通过终止睡眠来跳出循环(即,如果它是前台进程,则 ctrl-c 会这样做)。

    正如 Montecristo 所指出的,如果我们谈论的是几分钟或几小时的间隔,cron 可能会做得更好。

    【讨论】:

    • 我明白了.. 我会试试这个。谢谢你们!那我最好也读一下“man cron”。 =)
    • 函数调用末尾不应有括号。
    【解决方案2】:

    你可能想做一个ma​​n cron

    或者,如果您只需要坚持使用 bash,只需将函数调用放在循环中,然后在迭代中 sleep 60

    【讨论】:

      【解决方案3】:

      请在此处找到您可以使用的脚本,首先将一个条目添加到您的 cron 作业中,如下所示:

      $ sudo crontab -e * * * * * /path/to/your/switcher

      这是一个简单的方法,每分钟连续ping一个活着的服务器,如果服务器不可达,它将切换到下面定义的第二个路由器。

      当然有更好的方法来利用这个问题。

      $ cat > 切换器

      #!/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
      

      【讨论】:

      • 上面的错字 - 应该是“sudo crontab -e ...”而不是“sudo contab -e ...”
      • 这看起来是最好的解决方案,因为 cron 是为这类任务设计的。在一些可重复的时间延迟上做某事(即脚本)。
      • 我认为脚本错过了自动检测默认路由器,但认为我找到了它
      • 我真的觉得必须教钓鱼,这个最后的用法是CTRL+C CTRL+V...恕我直言^^
      【解决方案4】:

      我喜欢威廉的回答,因为它不需要投票。所以我根据他的想法实现了下面的脚本。它解决了控制必须返回shell的问题。

      #!/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)"
      

      【讨论】:

        【解决方案5】:

        您可以执行以下操作,但它不可靠:

        #!/bin/sh 陷阱句柄定时器 USR1 set_timer() { (sleep 2; kill -USR1 $$)& } 处理定时器(){ printf "%s:%s\n" "定时器已过期" "$(date)"; 设置定时器 } 设置定时器 虽然是真的;睡一觉;日期;完毕

        这种技术的一个问题是陷阱在当前任务返回到 shell 之前不会生效(例如,将 sleep 1 替换为 sleep 10)。如果 shell 大部分时间都在控制中(例如,如果它调用的所有命令都将快速终止),那么这可以工作。当然,一种选择是在后台运行所有内容。

        【讨论】:

          【解决方案6】:

          创建一个 bash 脚本,检查一次互联网连接是否断开,并将脚本添加到每 60 秒运行一次的 crontab 任务中。

          【讨论】:

            猜你喜欢
            • 2018-02-24
            • 2011-09-04
            • 1970-01-01
            • 2012-06-05
            • 2015-04-19
            • 2023-01-08
            • 1970-01-01
            • 2020-01-05
            • 1970-01-01
            相关资源
            最近更新 更多