AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 3299
Accepted
Dima
Dima
Asked: 2010-08-30 16:54:27 +0800 CST2010-08-30 16:54:27 +0800 CST 2010-08-30 16:54:27 +0800 CST

网络启动时如何运行cron作业?

  • 772

我有一些每天运行的 anacron 作业。这些脚本更新本地 bzr 和 git 存储库。自然,这些脚本需要有效的网络连接。我在笔记本电脑上,经常有线和无线互联网速度不够快。这会导致我的 cron 作业在提取存储库时超时 =(

所以:

如何在运行特定的 cron 作业之前确保互联网已启动?或者如果没有网络,如何使工作失败,以便 anacron 稍后再次重试?

cron-jobs cron crontab
  • 9 9 个回答
  • 20354 Views

9 个回答

  • Voted
  1. Best Answer
    vava
    2010-08-30T21:54:37+08:002010-08-30T21:54:37+08:00

    我认为您可以使用Upstart来帮助您。请注意,我还没有测试过下面的代码是否有效,但应该有一些非常相似的东西。

    # /etc/init/update-repositories.conf - Update local repos
    #
    
    description     "Update local repos"
    
    # this will run the script section every time network is up
    start on (net-device-up IFACE!=lo)
    
    task
    
    script
        svn up && git fetch
    #   do some other useful stuff
    end script
    

    差不多就是这样。您可能需要添加一些代码来检查它是否不经常运行。您可能还想添加start update-repositories到您的 crontab,如果您长时间上网,它将确保您的更新会发生。

    • 8
  2. Marco Ceppi
    2010-08-30T18:27:34+08:002010-08-30T18:27:34+08:00

    我做了一个在 DNS 服务器上进行 ping 测试以确保联网的 cron。像这样的东西:

    ping 8.8.8.8 -c 1 -i .2 -t 60 > /dev/null 2>&1
    ONLINE=$?
    
    if [ ONLINE -eq 0 ]; then
        #We're offline
    else
        #We're online
    fi
    

    最近我用过这样的东西:

    #!/bin/bash
    
    function check_online
    {
        netcat -z -w 5 8.8.8.8 53 && echo 1 || echo 0
    }
    
    # Initial check to see if we are online
    IS_ONLINE=check_online
    # How many times we should check if we're online - this prevents infinite looping
    MAX_CHECKS=5
    # Initial starting value for checks
    CHECKS=0
    
    # Loop while we're not online.
    while [ $IS_ONLINE -eq 0 ]; do
        # We're offline. Sleep for a bit, then check again
    
        sleep 10;
        IS_ONLINE=check_online
    
        CHECKS=$[ $CHECKS + 1 ]
        if [ $CHECKS -gt $MAX_CHECKS ]; then
            break
        fi
    done
    
    if [ $IS_ONLINE -eq 0 ]; then
        # We never were able to get online. Kill script.
        exit 1
    fi
    
    # Now we enter our normal code here. The above was just for online checking
    

    这不是最优雅的 - 我不确定如何通过系统上的简单命令或文件进行检查,但这在需要时对我有用。

    • 7
  3. Dennis Kaarsemaker
    2010-08-31T05:07:43+08:002010-08-31T05:07:43+08:00

    您可以与 NetworkManager 交谈以查看您是否已连接:

    $state = $(dbus-send --system --print-reply \
        --dest=org.freedesktop.NetworkManager \
        /org/freedesktop/NetworkManager \
        org.freedesktop.NetworkManager.state 2>/dev/null \
    | awk '/uint32/{print $2}')
    if [ $state = 3 ]; then
        echo "Connected!"
    else
        echo "Not connected!"
    fi
    
    • 2
  4. JonTheNiceGuy
    2015-10-16T12:43:45+08:002015-10-16T12:43:45+08:00

    只是将这里的几个选项包装成一个脚本:

    #! /bin/bash
    # This script checks that the interface is up, and that an internet connection is available
    # It is based on code from http://askubuntu.com/questions/3299/how-to-run-cron-job-when-network-is-up
    #
    # Then it sleeps for a random number of seconds between 30 and 600.
    # This is based on code from http://tldp.org/LDP/abs/html/randomvar.html
    #
    # Collated by @JonTheNiceGuy on 2015-10-15
    
    function check_ipaddr
    {
      # Here we look for an IP(v4|v6) address when doing ip addr
      # Note we're filtering out 127.0.0.1 and ::1/128 which are the "localhost" ip addresses
      # I'm also removing fe80: which is the "link local" prefix
    
      ip addr | \
      grep -v 127.0.0.1 | \
      grep -v '::1/128' | \
      grep -v 'inet6 fe80:' | \
      grep -E "inet [[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+|inet6" | \
      wc -l
    }
    
    function check_google
    {
      netcat -z -w 5 8.8.8.8 53 && echo 1 || echo 0
    }
    
    until [ `check_ipaddr` -gt 1 ]; do
      sleep 2
    done
    
    until [ `check_google` -eq 1 ]; do
      sleep 2
    done
    
    sleep $((RANDOM%570+30))
    

    我计划在https://gist.github.com/JonTheNiceGuy/5cf4a23c8f2f755a9ca4维护这个脚本

    • 2
  5. Dirk Eddelbuettel
    2010-08-30T18:23:27+08:002010-08-30T18:23:27+08:00

    为了扩展 nixternal,fping二进制文件非常适合。你可以用单线把它煮熟,就像

    $ fping -q yoo.mama && echo yes
    $ fping -q www.google.com && echo yes
    yes
    $ 
    

    如您所见,yoo.mama 不喜欢我,但 Google 喜欢。在 crontab 中,你会做类似的事情

    5 5 * * *  root   fping -q google.com && /some/script/I/want --to --run
    
    • 1
  6. Rich Johnson
    2010-08-30T17:20:13+08:002010-08-30T17:20:13+08:00

    我所做的是创建一个 shell 脚本来满足你的需要,即。检查网络连接,然后启动更新。然后从 cron 调用脚本。

    • 0
  7. cmcginty
    2014-01-10T00:25:56+08:002014-01-10T00:25:56+08:00
    until ifconfig eth | grep -qE 'addr:([[:digit:]]+\.?)+'; do
       sleep 2
    done
    
    • 0
  8. waltinator
    2017-11-07T09:18:00+08:002017-11-07T09:18:00+08:00

    我定义了一个bash别名来回答这个问题:

    alias netstate='ip link show | egrep -q '\''UP,LOWER_UP.* state UP'\'' && echo UP || echo DOWN'
    

    您可以使用它,也可以处理ip link show自己的输出。

    要处理“网络关闭/网络出现”,请参阅我在net-o-matic 的net-o-matic脚本

    • 0
  9. Jack Wasey
    2018-01-29T02:14:56+08:002018-01-29T02:14:56+08:00

    我发现ping解决方案给了我网络错误,这些错误会向我的日志发送垃圾邮件,除非我费力地将错误定向到 /dev/null

    网络管理器可用于:

    if nmcli general | grep "^connected" >/dev/null
    then
       echo "nmcli connected"
    fi
    
    • 0

相关问题

  • 管理员应该如何阅读 root 的邮件?

  • 如何每 5 秒运行一次脚本?

  • 如何使 cron 电子邮件成为我的 @gmail 帐户

  • 备份 bash 脚本未压缩其 tarball

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何安装 .run 文件?

    • 7 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    如何获得 CPU 温度?

    • 21 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Marko Smith

    如何使用命令行将用户添加为新的 sudoer?

    • 7 个回答
  • Marko Smith

    更改文件夹权限和所有权

    • 9 个回答
  • Marko Smith

    你如何重新启动Apache?

    • 13 个回答
  • Marko Smith

    如何卸载软件?

    • 11 个回答
  • Marko Smith

    如何删除 PPA?

    • 26 个回答
  • Martin Hope
    NES 如何启用或禁用服务? 2010-12-30 13:03:32 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    Olivier Lalonde 如何在结束 ssh 会话后保持进程运行? 2010-10-22 04:09:13 +0800 CST
  • Martin Hope
    David B 如何使用命令行将用户添加为新的 sudoer? 2010-10-16 04:02:45 +0800 CST
  • Martin Hope
    Hans 如何删除旧内核版本以清理启动菜单? 2010-08-21 19:37:01 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve