
У меня есть скрипт, который я сделал в виде oneshot systemd service. Он работает на raspberry pi, и суть в том, что если он не может подключиться к интернету, он перенастраивает адаптер wifi (?) для создания сети ad hoc и перезагружается.
Проблема, с которой я столкнулся, заключается в том, что при проверке он еще не получил IP-адрес и поэтому думает, что не может подключиться.
Я попробовал использовать After=
параметр be network-online.target
, но это ничего не изменило, и я попробовал ввести sleep
команду в сам скрипт, но снова никаких изменений.
Есть идеи?
Вот сценарий check_connection.sh
:
INTERFACE_NAME=$(iwconfig 2>/dev/null | grep -o "^\w*")
sleep 5;
if ifconfig $INTERFACE_NAME | grep -q "inet addr"
then
echo 'connected'
# if connected check if it's ad hoc mode or not
if iwconfig $INTERFACE_NAME | grep -q "Mode:Ad-Hoc"
then
echo 'start dhcp server'
# if running in ad hoc mode make sure server starts
sudo service isc-dhcp-server start
fi
else
echo 'not connected'
# if not connected switch settings to ad hoc and reboot
sudo cp /etc/network/interfaces-adhoc /etc/network/interfaces
sudo reboot
fi
/etc/systemd/system/check_connection.service:
[Unit]
Description=Check whether connected at startup
After=network-online.target
[Service]
User=root
ExecStart=/bin/bash /home/pi/check_connection.sh
[Install]
WantedBy=multi-user.target
РЕДАКТИРОВАТЬ
Операционная система, на которой я работаю:Linux raspberrypi 4.1.7+ #817 PREEMPT Sat Sep 19 15:25:36 BST 2015 armv6l GNU/Linux
решение1
Одним из решений было бы обновление ifupdown
пакета до более высокой версии (>= 0.8.9) с помощью Debian Backports (Iдуматьэто должно работать на raspberian), посмотрите наhttps://backports.debian.org/Instructions/. Затем вам необходимо обновить ifupdown
пакет.
Здесь происходит то, что network-online.target
не тянет ни одну службу, и это означает, что он считается "запущенным" без фактического ожидания чего-либо. С новой версией файла, ifupdown
содержащей networking.service
следующие строки, это означает, что он заставит network-online.target
ждать, пока он полностью не запустится:
[Install]
WantedBy=multi-user.target
WantedBy=network-online.target
EDIT: Другим вариантом может быть использование After=networking.service
вместо