Почему команды post-up в / etc / network / interfaces запускаются несколько раз при загрузке?

10

Вот содержание /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 раза :( что происходит?

TCZ8
источник
1
Подсказка: lo устанавливает if-up.d в значение true, а eth0 также устанавливает его в значение true. После запуска запускается после каждого из них. Ваш скрипт должен зависеть только от одного работающего интерфейса, а не от обоих.
eyoung100
Я подумал, что это может быть что-то в этом роде, угадайте время RTFM еще.
TCZ8
Я проверил и не могу найти, как указать, какой адаптер для команды post-up, похоже, как-то связан со строфой, но я точно не понимаю. страница интерфейсов Debian и Ubuntu содержит довольно много информации, но они пропустили эту часть.
TCZ8
1
Не имеет отношения к вопросу, но, кстати, echo $(date)это немного неловко и косвенно. Можно просто записать это как date. Похоже на « Бесполезное использование кошки» .
Селада
хахаха! ты абсолютно прав! Я понятия не имею, почему я это сделал: P
TCZ8

Ответы:

13

Файлы /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не пришел нужный интерфейс ( ) вверх.

Celada
источник
ОХ ЧЕЛОВЕК! В заключение! вы абсолютно правы, я просто добавил строку в sshstart, чтобы отобразить $ IFACE в моем файле журнала, и это именно так, как вы это описали! 1-й раз - это lo, 2-й - это eth0, 3-й - снова eth0 (из пост-апа), а 4-й раз не так уж и ясен. Значение $ IFACE в 4-й раз: - все вы не знаете, что это означает? Просто из любопытства :)
TCZ8
1
Я не знал о --all. Похоже, что есть возможность запускать if-up.dсценарии в последний раз с этим аргументом, чтобы сигнализировать о том, что все интерфейсы уже запущены , в случае, если какой-либо сценарий захочет предпринять действие, когда станет известно, что дальнейшие интерфейсы не ожидают. Это объясняет четвертый раз.
Селада
Это имеет смысл, спасибо за вашу помощь!
TCZ8
3

Как утверждает Celada, /etc/network/if-up.dскрипты запускаются для каждого интерфейса. Чтобы избежать дублирования правил, просто добавьте:

[ "$IFACE" = "eth0" ] || exit 0

в верхней части вашего сценария. Это приведет к немедленному завершению работы скрипта, если интерфейс не является желаемым.

ppparadox
источник
1

Удалить пустую строку перед post-up-командой. Это должно относиться только к post-upкоманде eth0. Дополнительно переместите ваш скрипт из if-up.dпапки. Скрипты в этой папке выполняются автоматически, независимо от того, определены ли они как post-up. В вашем случае он будет работать дополнительно к вашей post-up-команде.

xx4h
источник
Не работает, см. Редактирование в моем вопросе.
TCZ8