как пропустить сообщение «соединение: сеть недоступна»

1

Я создал скрипт, который запускается при загрузке, который проверяет наличие интернет-соединения на моем малине pi и в то же время обновляет время (уход за ntp) - через os.system().

import datetime, os, socket, subprocess
from time import sleep

dir_path = os.path.dirname(os.path.abspath(__file__))

def internet(host="8.8.8.8"):
    result = subprocess.call("ping -c 1 "+host, stdout=open(os.devnull,'w'), shell=True)
    if result == 0:
        return True
    else:
        return False


timestr = time.strftime("%Y-%m-%d--%H:%M:%S")
netstatus = internet()

while netstatus == False:
    sleep(30)
    netstatus = internet()

if netstatus == True:
    print "successfully connected! updating time . . . "
    os.system("sudo bash "+dir_path+"/updatetime.sh") 
    print "time updated! time check %s"%datetime.datetime.now()

где updatetime.sh содержит следующее:

service ntp stop
ntpd -q -g
service ntp start

этот скрипт запускается при перезагрузке/загрузке, и я запускаю это на нашем рабочем месте, 24/7. Кроме того, выходы из таких сценариев сохраняются в файле журнала. он отлично работает, но есть ли способ, как НЕ выводить connect: Network is unreachable если нет подключения к Интернету? Благодарю.

редактировать

Я запускаю этот скрипт с помощью сценария оболочки с именем launch.sh который запускает check_net.py (это имя скрипта) и других предварительных сценариев, и я поместил launch.sh в свой crontab для запуска при загрузке/перезагрузке:

@reboot sh /home/pi/launch.sh > /home/pi/logs/cronlog 2>&1

из того, что я читал в этом потоке: что означает '>/dev/null/2> & 1', 2 обрабатывает stderr где 1 дескриптор stdout.

Я новичок в этом. Я хочу видеть мой stdout - но не stderr (в этом случае connect: Network is unreachable сообщения (только)..

/OGS

  • 1
    Перенаправить ошибки в / dev / null? Например, вызовите скрипт следующим образом: «updatetime.sh 2> / dev / null»
  • 0
    Вы пытались написать stderr в / dev / null?
Показать ещё 6 комментариев
Теги:
networking
python-2.x
raspberry-pi

1 ответ

0
Лучший ответ

В соответствии с предложением ссылки @shellter в комментариях я реструктурировал свой cron, чтобы:

@reboot sh /home/pi/launch.sh 2>&1 > /home/pi/logs/cronlog | grep "connect: Network is unreachable" 

альтернативно, я также urllib2.urlopen() альтернативное решение, которое предполагает другой способ проверки подключения к Интернету с использованием urllib2.urlopen():

def internet_init():
    try:
        urllib2.urlopen('https://www.google.com', timeout=1)
        return True
    except urllib2.URLError as err:
        return False

один из двух вышеперечисленных методов пропустил любое connect: Network is unreachable вывод ошибки в моих журналах.

Спасибо!

/OGS

  • 1
    Я рад, что вы делаете успехи, но я не вижу, как 2>&1 > cronlog| grep "connect" удаляет сообщения о connect которые вы не хотите видеть. Вы уверены, что во время тестирования произошла ошибка и что сообщение было сгенерировано? Если это так, то посмотрите локальную электронную почту для пользователя, которому принадлежит задание cron вы создали. Я ожидаю увидеть там ошибки connect . Чтобы удалить сообщения из потока, вам нужен grep -v srchTarget , но как только вы перенаправили stderr и stdout в файл, на самом деле ничего не будет отправлено в канал и grep после него. (Я могу ошибаться ;-) ).
  • 0
    да, я уверен. Я также проверил его во втором модуле Raspberry Pi, где я эмулировал отключение интернета, и ошибка «connect: Network is unreachable» не появляется в / home / pi / logs / cronlog - этот файл, кстати, отправляется по электронной почте через ssmtp в конец дня. обратите внимание, что реструктурированный cron применяется к исходной функции internet (), указанной выше, а не к функции internet_init (). Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню