Чому команди завантаження в / etc / network / інтерфейси виконуються кілька разів під час завантаження?


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 робить щось чи ні, але напевно 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 рази :( що відбувається?


1
Підказка: lo встановлює if-up.d на true, а eth0 також встановлює його на true. Післявиконання працює після встановлення кожного. Ваш сценарій повинен залежати лише від одного інтерфейсу, який працює, а не від обох.
eyoung100

Я подумав, що це може бути щось подібне, вгадайте свій час до RTFM ще трохи.
TCZ8

Я перевірив, і я не можу знайти, як вказати, який адаптер для команди "post-up", схоже, має щось спільне зі "строфою", але я точно не розумію. на сторінці інтерфейсів Debian та Ubuntu є досить багато інформації, але вони пропустили цю частину.
TCZ8

1
Не пов'язане з питанням, але BTW echo $(date)начебто незручний і непрямий. Можна також просто прописати це date. Подібно до марного використання нагороди Cat .
Селада

ха-ха! ти абсолютно правий! Я не маю поняття, чому я це зробив: 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) не прийшов вгору


О, ЧОЛОВИК! Нарешті! ви абсолютно праві, я щойно додав рядок до sshstart, щоб відлучити $ IFACE у моєму лог-файлі та точно так, як ви його описали! 1-й раз - ось, 2-й раз - "еті0", 3-й - знову "ет0" (форма "після"), а четвертий - не так зрозуміло. Значення $ ІФАСЕ в 4-й раз: - всі ви не знаєте, що це засоби? Просто від цікавості :)
TCZ8

1
Я про це не знав --all. Здається, є функція запускати if-up.dсценарії востаннє з цим аргументом, щоб повідомити про те, що всі інтерфейси зараз запущені , якщо якийсь сценарій захоче вжити дії, коли стане відомо, що ніяких додаткових інтерфейсів не очікується. Це пояснює четвертий раз.
Селада

Це має сенс, дякую за всю вашу допомогу!
TCZ8

3

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

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

вгорі вашого сценарію. Це призведе до негайного виходу сценарію, якщо інтерфейс не є потрібним.


1

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


Не працює, дивіться правки в моєму запитанні.
TCZ8
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.