Сценарий - это: у 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, если масштаб времени имеет значение вообще.
Распространенный способ сделать это состоит в том, чтобы сначала скопировать его во временное имя файла, предпочтительно скрытый файл. Когда копия заканчивается, сценарий, который делает копию затем, переименовывает ее к нескрытому имени файла.
Сценарий на машине 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 передавать каждый файл, поскольку это заканчивается, не ожидая следующего файла.
Делает lsof
на машине B показывают, что scp имеет открытый файл? если так, Вы могли смотреть lsof
и посмотрите, когда scp закроет файл. В противном случае Вы могли наблюдать размер файла и после того, как он не изменился в течение установленного срока времени (5 минут, например), скопируйте его от B до C.
Третья опция состояла бы в том, чтобы скопировать файлы от до к "in_progress" каталогу на C. После концов копии на A выполните a mv
управляйте для перемещения из "in_progress" каталога.
Я просто думал о другом, абсолютно несвязанной опции. Не использует scp вообще. Сообщите мне, работало ли это:
на B создайте канал FIFO где-нибудь: mkfifo/tmp/xfer
на A не используйте scp, вместо этого, tar -cz files | ssh B 'cat > /tmp/xfer
на C, выполненном ssh B 'cat /tmp/xfer' | tar -xz
Таким образом, данные не хранятся на B, они просто проходят через канал. Оборотная сторона к этому, у Вас может только быть одна копия, идущая за один раз...
Необходимо будет удостовериться, что процесс на C повторно мечет икру каждый раз, когда он заканчивается.
После размышления об отправленных ответах (в особенности идея @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 \;
Надо надеяться, это будет работать. Следующий файл должен все же завершиться, таким образом, я не могу прокомментировать, если он действительно работает в сочетании со сценарием крона, но я сделал некоторые файлы вручную и отобрал их, и они переместились прекрасный. скрестите мои пальцы
Править: Это работает, хотя, как это первоначально имелось некоторые ошибки, они исправлены теперь.
Копия будет или работать как другой процесс, или Вы могли вызвать ее к, с помощью подоболочки. Затем Вы могли использовать PS, чтобы "следить" за процессом и видеть, когда он исчезает.
Кроме того, я полагаю, что в *отклоняют, можно удалить файл, в то время как он копируется. Система не удалит его, пока программа копии не закроет его. Конечно, если копия не успешно выполняется, Вы теряете файл, таким образом, не лучшая идея.
Никакая потребность в mkfifo. На машине B, выполняет это:
ssh A 'tar -cz files' | ssh C 'tar -xz'
Вы могли бы найти-C опцию tar полезной.
Если необходимо инициировать копирование на машине A, просто сделайте:
tar -cz files' | ssh B "ssh C 'tar -xz'"
Не упустите надлежащее заключение в кавычки, все же.