Я создал скрипт, который запускается при загрузке, который проверяет наличие интернет-соединения на моем малине 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
В соответствии с предложением ссылки @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
2>&1 > cronlog| grep "connect"
удаляет сообщения о connect
которые вы не хотите видеть. Вы уверены, что во время тестирования произошла ошибка и что сообщение было сгенерировано? Если это так, то посмотрите локальную электронную почту для пользователя, которому принадлежит задание cron
вы создали. Я ожидаю увидеть там ошибки connect
. Чтобы удалить сообщения из потока, вам нужен grep -v srchTarget
, но как только вы перенаправили stderr и stdout в файл, на самом деле ничего не будет отправлено в канал и grep после него. (Я могу ошибаться ;-) ).