LINUX.ORG.RU
ФорумAdmin

Скрипт - смотрит каталог за файлами, аплоудит на фтп....?

 , , ,


0

4

Приветствую! Нужен баш скрипт который сидит на линуксе, смотрит в дефинированный каталог каждые н минут. если обнаруживает там файлы с заданным расширением - аплоудит их в внешний фтп сервер.

готового либо заготовки под такой скрипт с интернетах ненашёл, а мой скилл писания скриптов на баше на порядок ниже, чем требуется для написания такого. прошу помощи...

Пиши не на баше.

Deleted
()
Ответ на: комментарий от anonymous

Да какой жоб, тут делов на 5 минут. По сути тут только отправка файлов с нужным расширением на сервер, скрипт в одну строку (регулярность через cron).

Fedorast
()

это умеент winscp

dada ★★★★★
()

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

anonymous
()

а мой скилл писания скриптов на баше на порядок ниже, чем требуется для написания такого

Это must have skill, так что рекомендую приступать: https://www.opennet.ru/docs/RUS/bash_scripting_guide/ , а точнее https://www.opennet.ru/docs/RUS/bash_scripting_guide/abs-guide-flat.tar.gz .

Элементы конструктора:

Как заливать.
Вариант 1: Копировать используя ftp. Вот: http://superuser.com/questions/323214/how-to-upload-one-file-by-ftp-from-comm...
Вариант 2: Если есть ssh доступ, то можно scp

Искать файлы рекомендую find - вот здесь хорошо обсасывались варианты и решения. Передавать через xargs или в цикле как по ссылке выше.

Чтобы было периодически, делаешь бесконечный цикл со sleep.

Далее нужно понять как найти дельту.
Если приемлемо удалть файлы после копирования - удалять.
Если нет:
Вариант 1: искать find файлы новее определенной даты. Соответственно, после каждой операции сохранять даты в переменную.
Вариант 2: сравнивать с тем, что уже есть на сервере. Здесь тогда вообще рекомендовал бы монтировать ftp и использовать rsync.
Вариант 3: каждый раз при копировании, записывать в файл, потом, перед копированием, проверять наличие файла в сохраненном списке. Здесь есть подводные камни, так что, если выберешь - говори, подскажем.

Остальное - в документе по первой ссылке вверху или в google.

Что не получается - пиши.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Вариант 4: переименовывать загруженные файлы, добавляя напр. префикс uploaded, а в дальнейшем отфильтровывать по префиксу. Или перемещать загруженные файлы в отдельную директорию, к-ая игнорируется при рекурсивном мониторинге.

anonymous
()
Ответ на: комментарий от Kroz

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

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

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

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

wisedraco ★★
() автор топика
Ответ на: комментарий от wisedraco

как понять, что файл уже полностью скопировался, а не ещё льётся извне (получение будет тоже по фтп) — это тож надо обдумать

Никак.

Вы неверно ставите задачи — вам не нужно ничего делать раз в N минут, вам надо по факту окончания получения файла. Изучайте документацию на ваш FTPd.

И да, читать эту книжку Купера, что советует вам товарищ Kroz, не советую.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

как понять, что файл уже полностью скопировался, а не ещё льётся извне (получение будет тоже по фтп) — это тож надо обдумать

Никак.

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

anonymous
()
Ответ на: комментарий от zolden

Может тогда вместо rsync скриптовую обвязку лучше для фильтрации? incron же умеет передавать в параметры имя файла.

Radjah ★★★★★
()
Ответ на: комментарий от anonymous

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

Если попытаться получить эксклюзивный или неэксклюзивный доступ к файлу с эксклюзивным доступом, вы хотели сказать?

Ну да, а какие ftpd по-умолчанию берут себе эксклюзивный доступ к пишущемуся файлу?

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от zolden

Да стратегия тоже не ахти. Хотя если нет возможности подрезаться к ftpd, то пожалуй, да.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

нужно смотреть документацию по конкретным ftpd. Самый простой способ проверить - попытаться переименовать недокопированый файл.

anonymous
()
Ответ на: комментарий от anonymous

нужно смотреть документацию по конкретным ftpd

Вы на правильном пути.

Самый простой способ проверить - попытаться переименовать недокопированый файл.

Во-первых, сфигли бы? То есть чего вы вообще ожидаете в результате? А во-вторых, почему самый простой?

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Ожидаю эксепшн. Простой по причине того, что это легко проверить, копируя достаточно большой файл.

anonymous
()

Нужен — напиши.

Ты пришёл за благословением? Я тебе его даю.

Если ты хочешь чтобы тебе его написали за тебя, озвучь бюджет.

Дело не в сложности, а в принципе: или ты пытаешься, у тебя что-то не получается, или ты хочешь, чтобы всё сделали за тебя — это разные вещи, и отношение к ним разное.

r3lgar ★★★★★
()
Ответ на: комментарий от Zmicier

Да, вы правы, никакой эксклюзивности ожидать не стоит.

anonymous
()
Ответ на: комментарий от Zmicier

в то же время документация по ProFTPD дает простое решение по обсуждаемому вопросу: http://www.proftpd.org/docs/directives/linked/config_ref_HiddenStores.html Суть: при включенной опции HiddenStore файлы загружаются как 'in.имя_файла', после завершения загрузки переименовываются в 'имя_файла'.

anonymous
()
Ответ на: комментарий от anonymous

в то же время документация по ProFTPD дает простое решение по обсуждаемому вопросу

Ну, это скорее простой костыль, чем простое решение. Простое решение дает, например, pure-ftpd(8) — CallUploadScript. Но таки спасибо.

Zmicier ★★★★★
()
Ответ на: комментарий от anonymous

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

lsof || fuser

anc ★★★★★
()
Ответ на: Дубль два от Zmicier

Это про вариант когда файлы не удаляются/переименовываются, а остаются в каталоге.

anc ★★★★★
()
Ответ на: комментарий от Zmicier

Обоснуйте. Имхо этот как раз универсальное решение не привязанное к методу записи файла (ftp, nfs, локальная запись).

anc ★★★★★
()
Ответ на: комментарий от anc

А что, костыль уже не может быть универсальным?

Более того, аккуратные решения обычно тем и отличаются, что специфичностью.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

В рамках топика не убедили. Вызов больше одной команды (которая выполняется быстро) в скрипте не такая проблема. У меня почти такая же задача была реализована, только в виде - заливали на самбу а копировали дальше уже не помню через что (scp/ftp/что-то другое)

anc ★★★★★
()
inotifywait -e CLOSE_WRITE -m . --format 'put "%f"' | ftp -v example.org

cat ~/.netrc

machine example.org
login username
password passw0rd
macdef init
cd /pub/

default

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Круто. а стоит добавить '-e moved_to' к inotifywait?

ТС, отфильтровать нужные файлы можешь так:

inotifywait ... | sed -n '/\.txt"$/Ip' | ftp ...

Замени .txt на нужное тебе расширение. Ещё посмотри на опцию -r для inotifywait и спецификатор формата %w (полный путь к файлу). Как просто создать структуру папок на ftp, подобную той, за которой следим, я не знаю. У curl есть опция --ftp-create-dirs, в принципе, её можно использовать, но тогда тот полный путь, который отдаёт inotifywait, надо трансформировать в относительный и, боюсь, в одну строку тут уже не впишешься.

anonymous
()
Ответ на: комментарий от Zmicier

как успехи-то?

пока никак - других проблем навалилось! в среду попробую занятся этой...

wisedraco ★★
() автор топика
Ответ на: комментарий от anonymous

С, отфильтровать нужные файлы можешь так:

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

wisedraco ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.