Существует ли способ сказать, сделан ли файл, копируя?

Сценарий - это: у Machine A есть файлы, которые я хочу скопировать в Machine C. Machine A, не может получить доступ к C непосредственно, но может получить доступ к Machine B, который может получить доступ к Machine C. Я использую scp для копирования от Machine к B, и затем от B до C.

Машина B ограничила пространство памяти, поэтому поскольку файлы входят, я должен скопировать их в C и удалить их из B. Вторая копия намного быстрее, таким образом, это не проблема с пропускной способностью.

Я мог сделать это вручную, но я ленив. То, что я хотел бы, должно запустить скрипт на B или C, который скопирует каждый файл в C, поскольку каждый заканчивает. scp задание работает от A.

Таким образом, то, в чем я нуждаюсь, является способом спросить (предпочтительно из сценария удара), если файл X.avi "сделан", копируя. Каждый из этих файлов является различным размером, и я не могу действительно предсказать размер или время завершения.

Править: между прочим, времена передачи файлов - что-то приблизительно 1 час от до B и приблизительно 10 минут от B до C, если масштаб времени имеет значение вообще.

4
задан 15.07.2015, 16:06

6 ответов

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

Сценарий на машине B мог затем наблюдать за нескрытыми файлами.

Сценарий на машине A выглядел бы примерно так:

for file in `ls *` ; do
    scp $file user@host:~/.${file}.tmp
    ssh user@host "mv ~/.${file}.tmp $file"
done

Хотя это не удовлетворяет требование OP использовать короткое

scp * user@host:~/

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

7
ответ дан 07.12.2019, 19:12

Делает lsof на машине B показывают, что scp имеет открытый файл? если так, Вы могли смотреть lsof и посмотрите, когда scp закроет файл. В противном случае Вы могли наблюдать размер файла и после того, как он не изменился в течение установленного срока времени (5 минут, например), скопируйте его от B до C.

Третья опция состояла бы в том, чтобы скопировать файлы от до к "in_progress" каталогу на C. После концов копии на A выполните a mv управляйте для перемещения из "in_progress" каталога.

2
ответ дан 07.12.2019, 19:12

Я просто думал о другом, абсолютно несвязанной опции. Не использует scp вообще. Сообщите мне, работало ли это:

  1. на B создайте канал FIFO где-нибудь: mkfifo/tmp/xfer

  2. на A не используйте scp, вместо этого, tar -cz files | ssh B 'cat > /tmp/xfer

  3. на C, выполненном ssh B 'cat /tmp/xfer' | tar -xz

Таким образом, данные не хранятся на B, они просто проходят через канал. Оборотная сторона к этому, у Вас может только быть одна копия, идущая за один раз...

Необходимо будет удостовериться, что процесс на C повторно мечет икру каждый раз, когда он заканчивается.

2
ответ дан 07.12.2019, 19:12

После размышления об отправленных ответах (в особенности идея @Josh наблюдать измененные времена) я пытался работать, управляют файлами B на C. Посмотрите, B является анемичным до доступных инструментов, таким образом, ничто, что, казалось, смогло сделать задание, не было там. Я натолкнулся на это решение. Эта идея не является моей, я нашел его в поисках Google перед этим вопросом. Я отбросил его ранее, так как машина B не имела find утилита.

Во-первых, смонтируйте соответствующий каталог на B на C, таким образом, это появляется как локальная файловая система. Я использовал sshfs для этого (потрясающий инструмент, между прочим). Это позволит мне использовать утилиты C вместо B.

Во-вторых, команда find /the/folder/* -mmin +5 будет соответствовать всем файлам, измененным более чем 5 минут назад. Так команда find /the/folder/* -mmin +5 -exec {} /the/other/folder \; переместит все файлы, которые были изменены более чем 5 минут назад к другой папке (который находится на самом деле на C вместо sshfs, смонтированного от B.

Наконец, я настроил сценарий крона для выполнения вышеупомянутого скрипта каждые 10 минут сегодня и завтра. Строка в моем crontab похожа на это.

*/5 * 22,23 9 * find /the/folder/* -mmin +5 -exec mv {} /the/other/folder \;

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

Править: Это работает, хотя, как это первоначально имелось некоторые ошибки, они исправлены теперь.

2
ответ дан 07.12.2019, 19:12

Копия будет или работать как другой процесс, или Вы могли вызвать ее к, с помощью подоболочки. Затем Вы могли использовать PS, чтобы "следить" за процессом и видеть, когда он исчезает.

Кроме того, я полагаю, что в *отклоняют, можно удалить файл, в то время как он копируется. Система не удалит его, пока программа копии не закроет его. Конечно, если копия не успешно выполняется, Вы теряете файл, таким образом, не лучшая идея.

0
ответ дан 07.12.2019, 19:12

Никакая потребность в mkfifo. На машине B, выполняет это:

ssh A 'tar -cz files' | ssh C 'tar -xz'

Вы могли бы найти-C опцию tar полезной.

Если необходимо инициировать копирование на машине A, просто сделайте:

tar -cz files' | ssh B "ssh C 'tar -xz'"

Не упустите надлежащее заключение в кавычки, все же.

1
ответ дан 07.12.2019, 19:12

Теги

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