Как перезагрузить правила udev без перезагрузки?

awk '{$1=$1}1' OFS="\t" students.txt

Подтверждение концепции

$ awk '{$1=$1}1' OFS="\t" students.txt
Surname Forename        MSc     Stream  Date    of      Birth
Smith   John    IT      15.01.1986
Taylor  Susan   IT      04.05.1987
Thomas  Steve   MIT     19.04.1986

Объяснение

Причина это не работало, состоит в том потому что awk требует, чтобы одно из полей было изменено, прежде чем оно применит нового выходного разделителя полей. Обходное решение для этого дефекта (по моему скромному мнению), должно просто установить поле на себя, следовательно $1=$1


Для этого простого типа изменения Вы - более обеспеченное использование tr или sed

tr -s ' \t' '\t*' < students.txt
sed 's/[[:space:]]\+/\t/g' students.txt
219
26.05.2012, 12:58
8 ответов
# udevadm control --reload-rules && udevadm trigger
245
27.01.2020, 19:28
  • 1
    Сделайте Вам нужно udevtrigger впоследствии? –  Nils 26.05.2012, 23:28
  • 2
    @Nils На самом деле, Вам, возможно, понадобится udevtrigger (или скорее udevadm trigger на большинстве дистрибутивов) вместо этого (что, или разъем устройство и спина это). --reload-rules почти всегда бесполезно, как это происходит автоматически. –  Gilles 'SO- stop being evil' 05.03.2013, 12:28
  • 3
    udevadm trigger добился цели на CentOS 6 для меня. –  astrostl 07.08.2013, 21:19
  • 4
    udevtrigger или udevadm trigger не работал на меня. Я нашел, что некоторые устройства будут работать после разгрузки и загрузки модуля для того же (предположение, что это - загружаемый модуль). То, что я узнал, нужно не обязательно перезагрузить систему. Пример для сетевого устройства, я делаю rmmod ixgbe, rmmod tg3,rmmod e1000 затем modprobe ixgbe, modprobe tg3,modprobe e1000 в зависимости от типа сетевого драйвера. –  enthusiasticgeek 22.01.2015, 22:25
  • 5
    Ни одна из вещей, упомянутых среди ответов, не работала на меня на Debian Jessie (8.0). Вещь, которая работала, ip link set $oldname name $newname упомянутый здесь. В моем случае я должен был заменить названный iface lan с соединенным мостом iface (для KVM), и следовательно оригинал - теперь лежащий в основе - iface должен был получить свое старое название, eth1, назад. Таким образом, прием был: 1) снижают iface; 2) ремонтируют сетевую конфигурацию; 3) обновлением udev называющий файл правил; 4) переименовывают использование iface ip link...; 5) поднимите мост. –  kostix 20.03.2015, 17:53

Udev использует inotify механизм для наблюдения за изменениями в каталоге правил, и в библиотеке и в локальных деревьях конфигурации (обычно расположенный в /lib/udev/rules.d и /etc/udev/rules.d). Таким образом, большую часть времени Вы ничего не должны делать при изменении файла правил.

Только необходимо уведомить udev демона явно при выполнении чего-то необычного, например, если у Вас есть правило, которое включает файлы в другой каталог. Затем можно использовать обычную конвенцию для просьбы, чтобы демоны перезагрузили их конфигурацию: отправьте SIGHUP (pkill -HUP udevd). Или можно использовать udevadm команда: udevadm control --reload-rules.

Однако остерегайтесь этого, различные версии udev исторически имели различные триггеры для перезагрузки правил автоматически. Таким образом, если в сомнении, звонить udevadm control --reload-rules: это не будет делать ничего плохого так или иначе.

Правила udev только применяются, когда устройство добавляется. Если Вы хотите повторно применить правила к устройству, которое уже подключено, необходимо сделать это явно путем вызова udevadm trigger с правильными опциями соответствовать устройству (устройствам), конфигурация которого изменилась, например. udevadm trigger --attr-match=vendor='Yoyodyne' --attr-match=model='Frobnicator 300'.

70
27.01.2020, 19:28
  • 1
    systemd udev используют inotify для наблюдения за изменениями правил? –  Craig McQueen 19.05.2016, 05:28

Я добавляю это, потому что когда-нибудь оно мне понадобится ... снова.

Иногда вы получаете неправильное соответствие номеров устройств Ethernet и MAC-адресов. Иногда это действительно важно, например, при работе в виртуальной машине, когда каждое устройство назначается отдельной VLAN.

  1. Выключите сетевые интерфейсы, затем
  2. измените /etc/udev/rules.d/70-persistent-net.rules (или его эквивалент)
  3. перезагрузите с помощью udevadm control --reload-rules
  4. повторно запустить с помощью триггер udevadm --attr-match = subsystem = net
  5. активировать сетевые интерфейсы.

Я был удивлен, насколько хорошо это сработало.

19
27.01.2020, 19:28

Я не уверен, применимо ли это, и это определенно более старый пост, но он оказался довольно популярным в моем веб-поиске информации udev, поэтому я подумал, что могу поделиться некоторыми знаниями.

Вы можете запускать правила udev вручную для определенных устройств. Это относится только к дистрибутивам, относящимся к redhat (centos fedora и т. Д. И т. Д.)

После внесения соответствующих изменений в файл правил ( /etc/udev/rules.d/whateveryoucalledyourrules ) вы сможете повторить изменить в uevent устройства.

echo change > /sys/block/devname/partname1/uevent

Это приведет к принудительному чтению правила udev ТОЛЬКО для этого устройства. На мой взгляд, гораздо лучше и целенаправленнее.

13
27.01.2020, 19:28

Для меня нижеприведенная последовательность команд сработала так, как нужно.

Я сделал изменения в /etc/udev/rules.d/70-persistent-net.rules, чтобы изменить eth номер и перезагрузить их без перезагрузки.

/etc/init.d/networking stop
/etc/init.d/udev stop
udevadm control --reload-rules
/etc/init.d/udev start
/etc/init.d/networking start

Следуя этому, он был успешно загружен во время выполнения без перезагрузки машины.

Любые предложения или рекомендации по этому поводу приветствуются, так как я обнаружил это самостоятельно, читая man-страницы.

4
27.01.2020, 19:28

Я добавляю сюда правильный ответ, потому что мне потребовалось некоторое время, чтобы заметить его в комментарии от @энтузиаста-гика. Все, что вам нужно сделать (при условии, что вы находитесь на консоли сервера — очевидно, что это плохо делать, если вы подключены по ssh!):

  1. Получить список используемых интерфейсных модулей:

кошка /etc/udev/rules.d/70-persistent-net.rules | grep "PCI-устройство" | perl -pe 's/.*\((\w+)\).*/$1/g'| uniq

В моем случае это igb, поэтому он печатает именно это.

  1. введите sudo rmmod igb (замените igb драйвером карты, полученным на шаге 1.

затем отредактируйте /etc/udev/rules.d/70 -persistent-net.rules по мере необходимости, затем снова загрузите модуль, используя modprobe igb, снова заменив igb на свой

.
3
27.01.2020, 19:28

в случае нескольких сетей

cat /etc/udev/rules.d/70-persistent-net.rules | grep "PCI device" | awk '{print $NF}'|sed -e 's/(//g' -e 's/)//g'| uniq > /tmp/listnet
rm -rf /etc/udev/rules.d/70-persistent-net.rules 
for i in $(cat /tmp/listnet); do rmmod $i; modprobe $i;done
service network restart
rm -rf /tmp/listnet
0
27.01.2020, 19:28

Это небольшое изменение по сравнению с основной ответ:sudoказался мне необходимым для обеих команд.

Неподтвержденное свидетельство :выполнение sudo udevadm triggerзаняло ~2 секунды, но выполнение этого без sudo заняло всего ~0,2 секунды. Так что ясно, что они не делают то же самое для меня. Сделайте это вместо этого:

sudo udevadm control --reload-rules
sudo udevadm trigger

И, наконец, (по 2-й ссылке ниже ), отключите устройство и снова подключите его .

Ссылки:

  1. Как перезагрузить правила udev без перезагрузки?
  2. https://askubuntu.com/questions/1048870/permission-denied-to-non-root-user-for-usb-device/1187646#1187646

См. также комментарии к обоим ответам выше.

1
17.02.2020, 03:28

Теги

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