Последовательность
mount ... | logger
rc=$?
работает не так, как вы ожидали: возвращаемое значение канала - это возвращаемое значение последнего элемента в этом конвейере.
$> false | true; echo $?
0
Если вы используете bash, попробуйте PIPESTATUS
:
$> false | true; echo $? ${PIPESTATUS[0]}
0 1
$> true | false; echo $? {PIPESTATUS[0]}
1 0
PIPESTATUS
- это переменная массива. Подробности на странице руководства bash. В других оболочках может быть что-то похожее на PIPESTATUS
Вы, кажется, на частично правильном пути. Я предполагаю, что вы хорошо разбираетесь в Unix, но не в реальной системе FreeBSD. Я предполагаю, что причина этого в том, что вы подошли к этому несколько иначе, чем типичный пользователь rc.d в FreeBSD.
Я нахожу этот вопрос несколько поверхностным, так как лично я предпочел бы выяснить, почему пропадает арп. Но нам дают очень мало информации. Вместо этого мы делаем поспешные выводы. Однако они задают несколько интересных вопросов о том, как что-то делать во FreeBSD. Просто имейте в виду огромное предупреждение о том, что мы можем в конечном итоге использовать гаечный ключ в качестве молотка.
Сценарии запуска FreeBSD находятся в /etc/rc.d
, но вы никогда не должны создавать там ничего, кроме как оставить этот каталог операционной системе. В противном случае вы рискуете перезаписать свои вещи во время обновления. Если вы хотите написать свои собственные сценарии запуска/демона/службы, лучшим местом будет/usr/local/etc/rc.d
Рекомендуемое расположение файлов описано в выше
.И вместо того, чтобы писать все с нуля, вы можете получить множество вспомогательных функций, прочитав Практические сценарии rc.d в BSD
Вы спрашиваете в комментарии, можете ли вы использовать его в скрипте в /etc/rc.conf.d/*
. Пожалуйста пожалуйста не делайте этого. Файлы отсюда загружаются при запуске -, но цель этого каталога — иметь небольшие фрагменты с настройками конфигурации (, см. rc.conf). Большинство людей просто используют файл /etc/rc.conf
для настройки параметров системы -, но вы можете разбить их на небольшие сегменты и поместить в /etc/rc.conf.d
, хотя это и не так часто.
Было бы лучше поместить ваш более общий сценарий запуска в /etc/rc.local , который все еще поддерживается.Но я бы все же рекомендовал создать правильный rc-скрипт и поместить его в/usr/local/etc/rc.d
Если вы хотите полностью игнорировать rc-скрипты, другим распространенным способом запуска универсального скрипта при загрузке является использование ключевого слова @reboot в crontab
Однако я бы сказал, что вам не нужно создавать новый скрипт rc, так как функциональность уже есть.
Статический arp на самом деле хорошо документирован -, однако он очень прост. «Отсутствующая» документация может заключаться в том, как обрабатываются rc-скрипты. Он задокументирован в rc.conf :
. static_arp_pairs
(str) Set to the list of static ARP pairs that are to be
added at system boot time. For each whitespace separated
element in the value, a static_arp_<element> variable is
assumed to exist whose contents will later be passed to a
``arp -S'' operation. For example
static_arp_pairs="gw"
static_arp_gw="192.168.1.1 00:01:02:03:04:05"
Это означает, что вы можете добавить 3 статические записи arp, которые сохранятся после перезагрузки, добавив эти строки в /etc/rc.conf (Я рекомендую использовать команду sysrc ):
static_arp_pairs="a b c"
static_arp_a="1.2.3.4 11:22:33:44:55:66"
static_arp_b="1.2.3.5 22:33:44:55:66:77"
static_arp_c="1.2.3.6 33:44:55:66:77:88"
Или в вашем конкретном случае:
static_arp_pairs="myarp"
static_arp_myarp="172.16.16.9 11:54:33:A8:B2:6B"
Скрипт, обрабатывающий это, является частью ОС и находится в /etc/rc.d/static_arp
и очень прост. Он поддерживает только команды «старт» и «стоп».
Вы можете вызвать его из любого места, используя:
/etc/rc.d/static_arp start
Но я бы предпочел использовать команду service :
service static_arp start
Если по какой-то причине вы чувствуете искушение отредактировать/изменить /etc/rc.d/static_arp
, пожалуйста, не делайте этого! Root всемогущ, и вы можете делать все, что хотите -, но вы рискуете, что его заменят. Что вам нужно сделать, так это cp /etc/rc.d/static_arp /usr/local/etc/rc.d/mystatic_arp
и разместить там измененную версию. Обратите внимание на изменение имени и убедитесь, что оно отражено в сценарии!
Если вы привыкли к другим системам, возможно, вы просто поднимаете/отключаете интерфейс с помощью ifconfig. Но во FreeBSD вам следует рассмотреть возможность использования:
service netif restart <interface>
Честно говоря, я не проверял, приводит ли это также к статическому _арпеджиатору. Или что-то вроде:
service netif stop <interface>
...
service netif start <interface>
service routing restart
service static_arp start
Но зацикливание физического соединения может быть (и )подключением кабеля? Опять же, я не уверен, что тогда происходит с таблицей arp.Я ожидаю, что он все еще будет на месте, поскольку мы не отключили интерфейс административно.
ОБНОВЛЕНИЕ:@namezero подтвердил в комментарии, что целые arp-файлы, установленные со статическим _arp, выдерживают физические разъединения.
Но нам следует изучить это немного подробнее, чтобы полностью понять ваш случай. Тогда это максимально близко к ответу «а. Хороший способ предотвратить это»
.Если мы не получаем уведомления о физической ссылке -, то я не вижу лучшего способа, чем отслеживать ее. Если мы сохраним скрипт простым -, мы можем оставить его для обычного cron.
Если мы сможем увидеть изменения в ОС, то у нас будет хороший путь вперед. Демон изменения состояния устройства devd пригодится. Ваше описание отсутствует, поэтому я предположу, что у нас есть либо ССЫЛКА _ВВЕРХ, либо ССЫЛКА _ВНИЗ, чтобы действовать.
Создайте файл /etc/devd/interface.conf с содержимым:
notify 0 {
match "system" "IFNET";
match "subsystem" "(em0|em1)";
match "type" "LINK_DOWN";
action "/usr/local/sbin/alertme.sh $subsystem"
}
Это уведомит вас о сетевых интерфейсах em0 и em1.
Так что это может быть так же просто, как:
notify 0 {
match "system" "IFNET";
match "subsystem" "(em0|em1)";
match "type" "LINK_UP";
action "/etc/rc.d/static_arp start"
}
Тем не менее, это кажется мне чем-то вроде тупиковой ситуации, поскольку я бы потратил больше времени на выяснение того, почему отсутствуют записи arp. Но я надеюсь, что эти разные указатели могут привести вас в «некоторое» направление.
Это подводит нас к этому краткому списку, в котором описывается, как вы можете жить более счастливой жизнью с FreeBSD:
/etc/rc.conf