Вот содержание /etc/network/interfaces
:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
post-up /etc/network/if-up.d/sshstart
И sshstart
это скрипт со следующим:
curl something something darkside send a file over ftps in the background &
/usr/bin/autossh -M 0 -f -N -o ServerAliveInterval=15 -o ServerAliveCountMax=3 -R 127.0.0.1:2005:127.0.0.1:22 -R 192.168.1.10:2006:192.168.2.110:1912 -L 127.0.0.1:5249:192.168.1.212:5249 username@17.16.15.2 -p 8080
Когда машина перезагружается, curl
команда выполняется несколько раз, файл заканчивается 2 или 3 раза на ftp-сервере, и когда я смотрю на процессы, кажется, что запущено несколько экземпляров autossh ... Не уверен, что это как autossh делает что-то или нет, но наверняка curl не должен загружать файл несколько раз.
Я догадываюсь, что весь sshstart
сценарий запускается несколько раз, но я не понимаю, почему.
Я попытался найти подробную информацию о процессе настройки сети при загрузке, но все, что я мог найти, это информация о синтаксисе для файла интерфейсов.
Может кто-нибудь помочь, пожалуйста?
Спасибо.
--- Редактировать ---
Как предложено ниже, я изменил свой интерфейсный файл следующим образом (убрал пустые строки над пост-ап):
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
post-up /etc/network/if-up.d/sshstart
И добавил следующую строку в sshstart:
echo $(date)>>/run/shm/sshstart.log
Вот содержимое /run/shm/sshstart.log
после перезагрузки:
Wed Oct 29 08:07:00 EDT 2014
Wed Oct 29 08:07:07 EDT 2014
Wed Oct 29 08:07:07 EDT 2014
Wed Oct 29 08:07:07 EDT 2014
Так что его запускали 4 раза :( что происходит?
echo $(date)
это немного неловко и косвенно. Можно просто записать это какdate
. Похоже на « Бесполезное использование кошки» .Ответы:
Файлы
/etc/network/if-up.d
уже запускаются автоматически при появлении интерфейса (любого интерфейса). Когда вы указываете тот же сценарий для повторного запуска в явнойpost-up
команде, вы только заставляете сценарий выполняться снова. Так что я думаю, это то, что должно произойти:lo
появляется (с переменной средыIFACE=lo
) из-за того, что находится в/etc/network/if-up.d
.eth0
появляется (с переменной средыIFACE=eth0
) по той же причине.eth0
появляется (сIFACE
неустановленной переменной среды ), потому что вы просили об этом вpost-up
директиве.Я не уверен, откуда четвертый раз, но в любом случае это уже три.
Вам нужно либо найти сценарий где-нибудь в другом месте и запустить его один раз, используя
post-up
директиву, либо оставить его там, где он есть, но не указывать его вpost-up
директиве и проверить значение$IFACE
так, чтобы он ничего не делал, покаeth0
не пришел нужный интерфейс ( ) вверх.источник
--all
. Похоже, что есть возможность запускатьif-up.d
сценарии в последний раз с этим аргументом, чтобы сигнализировать о том, что все интерфейсы уже запущены , в случае, если какой-либо сценарий захочет предпринять действие, когда станет известно, что дальнейшие интерфейсы не ожидают. Это объясняет четвертый раз.Как утверждает Celada,
/etc/network/if-up.d
скрипты запускаются для каждого интерфейса. Чтобы избежать дублирования правил, просто добавьте:в верхней части вашего сценария. Это приведет к немедленному завершению работы скрипта, если интерфейс не является желаемым.
источник
Удалить пустую строку перед
post-up
-командой. Это должно относиться только кpost-up
командеeth0
. Дополнительно переместите ваш скрипт изif-up.d
папки. Скрипты в этой папке выполняются автоматически, независимо от того, определены ли они какpost-up
. В вашем случае он будет работать дополнительно к вашейpost-up
-команде.источник