Linux Внутренняя работа `cat`

Подружиться с FreeBSD

Вы, кажется, на частично правильном пути. Я предполагаю, что вы хорошо разбираетесь в Unix, но не в реальной системе FreeBSD. Я предполагаю, что причина этого в том, что вы подошли к этому несколько иначе, чем типичный пользователь rc.d в FreeBSD.

Я нахожу этот вопрос несколько поверхностным, так как лично я предпочел бы выяснить, почему пропадает арп. Но нам дают очень мало информации. Вместо этого мы делаем поспешные выводы. Однако они задают несколько интересных вопросов о том, как что-то делать во FreeBSD. Просто имейте в виду огромное предупреждение о том, что мы можем в конечном итоге использовать гаечный ключ в качестве молотка.

Написание rc-скриптов

Сценарии запуска FreeBSD находятся в /etc/rc.d, но вы никогда не должны создавать там ничего, кроме как оставить этот каталог операционной системе. В противном случае вы рискуете перезаписать свои вещи во время обновления. Если вы хотите написать свои собственные сценарии запуска/демона/службы, лучшим местом будет/usr/local/etc/rc.d

Рекомендуемое расположение файлов описано в выше

.

И вместо того, чтобы писать все с нуля, вы можете получить множество вспомогательных функций, прочитав Практические сценарии rc.d в BSD

/etc/rc.conf.d/*

Вы спрашиваете в комментарии, можете ли вы использовать его в скрипте в /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_ 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 

Честно говоря, я не проверял, приводит ли это также к статическому _арпеджиатору. Или что-то вроде:

service netif stop 
...
service netif start 
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
  • Если вы хотите иметь свои собственные сценарии rc, поместите их в /usr/local/etc/rc.d
  • Если вам нужен простой сценарий запуска, поместите его в /etc/rc.local(вы можете использовать источник rc, если хотите)
  • Если вам нужен по-настоящему общий сценарий при запуске, используйте @reboot с crontab
  • Использовать sysrc при редактировании/etc/rc.conf
  • Использовать службу при взаимодействии с rc-скриптами
  • Используйте devd , воздействуя на изменения состояния устройства
0
15.02.2020, 01:26
1 ответ

Лучший способ поиска файлов — команда find. Например:

for file in $(find / -type f -iname "*.pid"); do echo "$file = `cat $file | tr -d '\n'`"; done

Для отображения содержимого строковой переменной необходимо использовать двойные кавычки. В противном случае любые специальные символы (, такие как операторы )или строки, напоминающие команды Shell, могут рассматриваться как настоящие команды Shell и, конечно же, будут «выполняться» в Shell.

В первом случае вы искали каталог, где найденные файлы «.pid» содержали один специальный символ (Код новой строки Unix, код перевода строки, известный также как код LF ). Однако во втором случае вашего поиска файлы «.pid» не содержат специального символа новой строки в конце (файлы содержат только число в виде строки -и без окончания новой строки ). Попробуйте найти и открыть указанные файлы ".pid" в шестнадцатеричном редакторе и проверить последний символ. Содержимое ваших файлов может отличаться LF-кодом в конце(0Aв шестнадцатеричном формате ).

Некоторые файлы ".pid" содержат этот код LF, а некоторые нет. Это зависит от того, как были созданы файлы. Например, стандартная команда echoобычно также добавляет этот LF-код в конец строки. Однако вы также можете использовать аргумент -n, который не добавляет этот LF-код в конец вывода команды echo :

.
root@formuler3ip:~# echo "666" > /tmp/test1
root@formuler3ip:~# echo -n "666" > /tmp/test2
root@formuler3ip:~# xxd -g 1 /tmp/test1
00000000: 36 36 36 0a                                      666.
root@formuler3ip:~# xxd -g 1 /tmp/test2
00000000: 36 36 36                                         666
0
28.04.2021, 23:23

Теги

Похожие вопросы