Como executar a tarefa cron quando a rede está ativa?

5

Eu tenho alguns trabalhos de anacron que são executados diariamente. Os scripts atualizam os repositórios locais bzr e git. Naturalmente, esses scripts precisam de conexões de rede de trabalho. Eu estou em um laptop e muitas vezes com fio e internet sem fio não vêm rápido o suficiente. Isso faz com que meu cron job atinja o tempo limite ao puxar os repositórios = (

Então:

Como ter certeza de que a Internet está funcionando antes de executar tarefas cron específicas? Ou como falhar um trabalho se não houver rede, de tal forma que ele seja repetido novamente pelo anacron mais tarde?

    
por Dima 30.08.2010 / 02:54

9 respostas

8

Acho que você pode usar o Upstart para ajudá-lo. Lembre-se, eu não testei esse código abaixo funciona, mas algo muito semelhante deveria.

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

Isso é muito bonito. Você pode querer adicionar algum código para verificar se ele não é executado com muita freqüência. Você também pode querer adicionar start update-repositories ao seu crontab, isso fará com que sua atualização aconteça se você estiver na rede constantemente por um período prolongado de tempo.

    
por vava 30.08.2010 / 07:54
4

Eu fiz um cron que fez um teste de ping em um servidor DNS para garantir a rede. Algo parecido com isto:

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

Recentemente, usei algo assim:

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

Esta não é a MAIORIA elegante - não tenho certeza de como outra forma verificar através de um simples comando ou arquivo no sistema, mas isso funcionou para mim quando necessário.

    
por Marco Ceppi 30.08.2010 / 04:27
2

Você pode falar com o NetworkManager para ver se está conectado ou não:

$state = $(dbus-send --system --print-reply \
    --dest=org.freedesktop.NetworkManager \
    /org/freedesktop/NetworkManager \
    org.freedesktop.NetworkManager.state 2>/dev/null \
| awk '/uint32/{print }')
if [ $state = 3 ]; then
    echo "Connected!"
else
    echo "Not connected!"
fi
    
por Dennis Kaarsemaker 30.08.2010 / 15:07
2

Apenas para incluir algumas das opções aqui em um único script:

#! /bin/bash
# This script checks that the interface is up, and that an internet connection is available
# It is based on code from https://sobrelinux.info/questions/25394/how-to-run-cron-job-when-network-is-up"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))

Pretendo manter este script no link

    
por JonTheNiceGuy 15.10.2015 / 22:43
1

Para expandir em nixternal, o binário fping é excelente para isso. Você pode cozinhá-lo em one-liners como em

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

Como você pode ver, yoo.mama não gosta de mim, mas o Google sim. No crontab, você faria algo como

5 5 * * *  root   fping -q google.com && /some/script/I/want --to --run
    
por Dirk Eddelbuettel 30.08.2010 / 04:23
0
until ifconfig eth | grep -qE 'addr:([[:digit:]]+\.?)+'; do
   sleep 2
done
    
por cmcginty 09.01.2014 / 09:25
0

Eu defini um bash alias para responder a essa pergunta:

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

Você pode usá-lo ou processar a saída de ip link show .

Para lidar com "a rede cai / a rede aparece", consulte o meu script net-o-matic em Net-o-matic

    
por waltinator 06.11.2017 / 18:18
0

Descobri que ping solutions me forneceu erros de rede que enviaram spam para meus registros, a menos que eu tenha direcionado com muito cuidado erros para / dev / null

O Network Manager pode ser usado:

if nmcli general | grep "^connected" >/dev/null
then
   echo "nmcli connected"
fi
    
por Jack Wasey 28.01.2018 / 11:14
0

O que eu faço é criar um script de shell que faça o que você precisa, por exemplo. verifica a conexão de rede e dispara as atualizações. Em seguida, chame o script do cron.

    
por Rich Johnson 30.08.2010 / 03:20