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

Второй сохраняет текущий каталог (pwd), но первая команда отбрасывает пользователя к корневому каталогу корня.

3
07.04.2014, 15:55
2 ответа
[1125749]Я думаю, что лучше всего убедиться, что процесс B копирует только те файлы, которые были полностью переданы процессом A. Одним из способов сделать это было бы использование в процессе А комбинации [1126232]cp[1126233] и [1126234]mv[1126235], так как процесс [1126236]mv[1126237] использует системный вызов [1126238]rename[1126239] (при условии, что файлы находятся на одной и той же файловой системе), который является атомарным. Это означает, что с точки зрения процесса B, файлы появляются в полностью сформированном виде.

Одним из способов реализации этого является наличие в каталоге [1126240]частичной директории [1126241], которая игнорируется процессом B, в каталоге [1126242]/резервной директории [1126243]. Для процесса A вы можете сделать что-то вроде:

А для процесса B (используя [1126244]bash[1126245]):

Хотя программа, которую вы, вероятно, захотите изучить, как для процесса A, так и для процесса B, это [1126246]rsync[1126247]. [1126248]rsync[1126249] создает частичные файлы и атомически перемещается на место по умолчанию (хотя обычно частичные файлы являются скрытыми файлами, а не находятся в определенном каталоге). Rsync также позволяет избежать передачи файлов, которые ей не нужны, и имеет специальный дельта-алгоритм передачи только соответствующих частей файлов, которые необходимо обновить по сети ([1126250]rsync[1126251] должна быть установлена в обоих местах, хотя по умолчанию передачи все равно идут по [1126252]ssh[1126253]). Использование [1126254]rsync[1126255] для процесса A:[1297]Для процесса B:[1298]

1
27.01.2020, 21:23
[1126718]В этом сценарии, единственная гарантия, которую вы можете получить, это то, что B либо не скопирует файл, либо скопирует префикс файла. В не имеет возможности узнать, куда записывается файл, поэтому он будет прочитан до (текущего) конца файла, а затем остановлен.

Обычный способ избежать этой ошибки - скопировать файл под временным именем, а затем переименовать его:

В потребителе договориться о том, чтобы не копировать временные файлы. В вашем сценарии это можно сделать, сделав его точечным файлом - используйте [1127247]dest=$(TMPDIR=/резервное копирование mktemp .XXXXXXXX)[1127248] выше. Проще вызвать [1127249]rsync[1127250] вместо [1127251]cp[1127252], так как [1127253]rsync[1127254] использует эту стратегию по умолчанию:

На шаге B убедитесь, что эти временные файлы исключены, например:

Если вы не хотите полагаться на файлы точек, вы можете использовать каталог ступеней. Перемещение файла из одного каталога в другой является атомарным до тех пор, пока эти два каталога находятся в одной файловой системе.

2
27.01.2020, 21:23

Теги

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