Это НЕ работает:
# 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
на успехе. Это является самым простым, легким понять, и самый надежный метод, который Вы будете когда-либо находить.
Это в настоящее время невозможно. Однако вы можете использовать только SystemD-NetworkD-wait-online.service
как зависимость от загрузки для перенастройки Tinc. По моему опыту, TINC будет быстро реагировать на изменения в конфигурации сети. По крайней мере, на Linux он может использовать RtnetLink для прослушивания интерфейсов.
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
Я использую networkd-dispatcher
для запуска событий после изменения статуса интерфейса:
Networkd-dispatcher - это демон диспетчера для Состояние подключения systemd-networkd изменяется. Этот демон похож на NetworkManager-dispatcher, но гораздо более ограничен в типах поддерживаемых им событий из-за ограниченного характера systemd-networkd.
Ссылка на Gitlab