С systemd-networkd выполните действие после изменения конфигурации сети

Это НЕ работает:

# echo Hello World > example.txt
# gzip < example.txt > example.txt # WRONG!
# file example.txt
example.txt: gzip compressed data, from Unix, last modified: Thu Mar 21 19:45:29 2013
# gunzip < example.txt
<empty file>

Это - состояние состязания:

# echo Hello World > example.txt
# dd if=example.txt | gzip | dd of=example.txt # still WRONG!
# gunzip < example.txt 
Hello World # may also be empty

Проблема состоит в том что > example.txt (или dd of=example.txt в этом отношении), уничтожает файл, прежде чем другой процесс будет иметь шанс считать его. Таким образом, нет никакого очевидного решения, которое является, почему необходимо придерживаться mv.

Существует много способов, которыми Вы могли обмануть. Можно открыть файл, затем удалить связь с ним - файл продолжит существовать, пока Вы не закроете его - и затем создаете новый файл с тем же именем и пишете gzipped данные в это. Однако я не знаю очевидный способ принудить удар для использования этого, и даже если бы я сделал, то мой ответ все еще был бы:

Даже не делайте этого.

Если gzip сбои по любой причине или любой проблеме происходит, как Вы исчерпывающий пространство, в то время как gzipping (потому что другие процессы пишут, или результат gzip, больше, чем вход - который происходит для случайных данных - и т.д.), Вы просто потеряли свой файл.Поздравляю!

Создайте отдельный файл и mv на успехе. Это является самым простым, легким понять, и самый надежный метод, который Вы будете когда-либо находить.

10
10.10.2014, 14:19
3 ответа

Это в настоящее время невозможно. Однако вы можете использовать только SystemD-NetworkD-wait-online.service как зависимость от загрузки для перенастройки Tinc. По моему опыту, TINC будет быстро реагировать на изменения в конфигурации сети. По крайней мере, на Linux он может использовать RtnetLink для прослушивания интерфейсов.

1
27.01.2020, 20:02

Tinc должен обновляться как блок systemd, а не посылать прямые сигналы. Для этого необходимо настроить свои файлы юнитов на цепочку с соответствующими строками Require=, Before= и After= в разделе [Unit]. Также убедитесь, что вы установили правильное значение WantedBy= для сетевых служб. (т.е. WantedBy= { network.target, network-online.target, network-pre.target } вместо multi-user.target)

Это позволяет выполнить systemctl restart systemd-networkd.service для перезапуска сети. В сочетании с systemd-resolvd, udev/dbus (плюс wpa_supplicant@nic.service при работе с wifi) сеть просто работает.

Обязательно прочитайте статьи о переходе на systemd-networkd и зависимости юнитов. Это также способ посылать сигналы вашим systemd. service с помощью команды systemctl kill, как описано в systemd for administartors guide

2
27.01.2020, 20:02

Я использую networkd-dispatcher для запуска событий после изменения статуса интерфейса:

Networkd-dispatcher - это демон диспетчера для Состояние подключения systemd-networkd изменяется. Этот демон похож на NetworkManager-dispatcher, но гораздо более ограничен в типах поддерживаемых им событий из-за ограниченного характера systemd-networkd.

Ссылка на Gitlab

2
27.01.2020, 20:02

Теги

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