Скрипт Ksh для нескольких каталогов ftp одновременно

Я новичок на этом сайте, и у меня есть эта проблема:

У меня есть каталог в unix с несколькими каталогами в нем. Каждый каталог имеет около 5k файлов. Итак, мы говорим о файлах от 40 до 50 тыс. Файлов. Мне нужно отправить это на сервер Windows, используя FTP (только потому, что у меня только FTP). Итак, у меня есть скрипт, который проходит через каждый каталог и отправляет эти файлы. Однако это очень медленно, поэтому я хочу сделать это одновременно. Это то, что у меня есть прямо сейчас, оно начинает отправлять эти файлы, а затем каким-то образом не заканчивается. Журнал просто показывает, что он работал с сообщением 221 в конце. Однако это не гарантирует, что все мои файлы будут отправлены. Я рассчитываю на них вручную и могу видеть, что иногда, когда в папке есть 5000 файлов, иногда отправляется только 800. Журнал не перемещается.

Также мой скрипт продолжает работать долго после остановки передачи. Я вижу это с помощью ps -ef.

Может ли кто-нибудь взглянуть и посоветовать какое-либо улучшение или почему я получаю это странное поведение?

Некоторая информация о моей настройке:

  • HP-UX 9000/859 B.10.20 E
  • Версия Ksh: Как? try –version, echo $ KSH_VERSION, swlist, ничего не работало

Мой сценарий:

#! /usr/bin/ksh if [[ $# -eq 0 ]]; then print "No arguments, Please enter password for ftp process" exit fi exec 4>~/ftpParallel.log #Directory to send CONVERTED_DIR=/data/history/ #FTP Variables HOST=xxxxx.com PORT=8009 USER=yyyyy PASS=$1 ftpFiles(){ # Do some processing and lets get the group and the dategroup, Format will be# /DATA/BRCPCB/201101 GROUP=$1 DATEGROUP=$2 #now mount the destdir based on the curent dir DESTDIR=/DATA/$GROUP cd $CONVERTED_DIR/$GROUP/$DATEGROUP i=0 ftp -nv >&4 2>&4 |& print -p open $HOST $PORT print -p user $USER $PASS print -p mkdir $DESTDIR print -p mkdir $DESTDIR/$DATEGROUP print -p cd $DESTDIR/$DATEGROUP ls | while read filename ; do [[ -f $filename ]] && print -p put $filename (( i += 1 )) done print -p close print -p bye print -p "$DATEGROUP send $i files" } #Get All Folders structure, we will need it to iterate and search for PeakPro Files Later a=`find $CONVERTED_DIR -type d 2>/dev/null | awk 'BEGIN{FS="/"}{if($NF ~/^[0-9]{6}$/)print $(NF-1),$NF}'` echo "$a" | while read item ; do ftpFiles $item & #this will make the function be called in background done wait exit 0 

ОБНОВЛЕНИЕ :

Я изменил код в соответствии с запросом и нашел новые интересные вещи. Похоже, что мои задания FTP продолжают работать, даже после их остановки: это журналы FTP:

 $ tail -5 ftpParallel200103.log 150 Opening ASCII mode data connection for C31905.CVFS. 226 Transfer complete. 15931 bytes sent in 0.01 seconds (2117.55 Kbytes/s) 200 PORT command successful. 150 Opening ASCII mode data connection for C31905.RVFS. $ tail -5 ftpParallel200104.log 200 PORT command successful. 150 Opening ASCII mode data connection for WG4829.RVFS. 226 Transfer complete. 12110 bytes sent in 0.01 seconds (1011.91 Kbytes/s) 221 $ tail -5 ftpParallel200105.log 150 Opening ASCII mode data connection for C51047.CVFS. 226 Transfer complete. 159734 bytes sent in 0.15 seconds (1027.98 Kbytes/s) 200 PORT command successful. 150 Opening ASCII mode data connection for C51047.RVFS. $ 

Как вы можете видеть, только 1 из них закончили (код 221 – FTP BYE). Другие никогда не заканчиваются, и работа продолжает работать (я начал ее с помощью nohup ftpParallel.sh & ):

  rcsanto 8314 8299 5 10:15:27 ttyq6 0:00 ps -ef rcsanto 25834 25833 0 05:35:00 ? 0:00 ls rcsanto 25828 25826 0 05:35:00 ? 0:00 ls rcsanto 25813 25808 0 05:35:00 ? 0:27 ftp -nv rcsanto 25815 25808 0 05:35:00 ? 0:19 ftp -nv rcsanto 25833 25816 0 05:35:00 ? 0:01 ftpParallel.sh ./ftpParallel.sh roJabSuP08WJjco rcsanto 8299 8298 0 10:15:15 ttyq6 0:00 -sh rcsanto 8315 8299 1 10:15:27 ttyq6 0:00 grep rcsanto rcsanto 25808 1 0 05:34:46 ? 0:00 ftpParallel.sh ./ftpParallel.sh roJabSuP08WJjco rcsanto 25826 25815 0 05:35:00 ? 0:02 ftpParallel.sh ./ftpParallel.sh roJabSuP08WJjco rcsanto 25816 25808 0 05:35:00 ? 0:08 ftp -nv rcsanto 25825 25813 0 05:35:00 ? 0:02 ftpParallel.sh ./ftpParallel.sh roJabSuP08WJjco rcsanto 25827 25825 0 05:35:00 ? 0:00 ls 

Это nohup LOG:

 FTP starting at: Tue Feb 5 04:51:48 CST 2013 rm: /homrm: /homrm: /homrm: /homrm: /homrm: /home/rcsante/rcsante/rcsante/rcsante/rcsante/rcsanto/ftpParo/ftpParo/ftpParo/ftpParo/ft allel200allel200104.log non-existent 107.log non-exi106.log304.log non-existent non-existent stent non-existent 

Я считаю, что переменные каким-то образом перепутались. Также выясняется, что FTP умирает в течение часа после запуска, возможно, его выкалывание?

 -rw-rw-rw- 1 rcsanto pp_user 249853 Feb 5 05:51 ftpParallel200103.log -rw-rw-rw- 1 rcsanto pp_user 937693 Feb 5 06:22 ftpParallel200104.log -rw-rw-rw- 1 rcsanto pp_user 172395 Feb 5 05:47 ftpParallel200105.log -rw-rw-rw- 1 rcsanto pp_user 88497 Feb 5 05:41 ftpParallel200106.log -rw-rw-rw- 1 rcsanto pp_user 981598 Feb 5 06:24 ftpParallel200107.log -rw-rw-rw- 1 rcsanto pp_user 819814 Feb 5 06:21 ftpParallel200304.log 

Спасибо за вашу помощь.

One Solution collect form web for “Скрипт Ksh для нескольких каталогов ftp одновременно”

Мне кажется, что ваш цикл, в конце скрипта, не работает. Вы собираете несколько пар в одной переменной, а именно a . Все эти пары разделены пробелами, потому что все новые строки, напечатанные awk, преобразуются в пространствах оболочкой. Затем вы печатаете его, используя echo как только одну строку. И вы читаете его обратно в одном variale, а именно в item . Таким образом, item имеет тот же контент, что и a . Это означает, что ваша петля только петли один раз. Если я понял, что вы делаете, вы можете, вероятно, изменить его так:

 find $CONVERTED_DIR -type d 2>/dev/null \ | awk 'BEGIN{FS="/"}{if($NF ~/^[0-9]{6}$/)print $(NF-1),$NF}'` \ | while read group dategroup do ftpFiles $group $dategroup & #this will make the function be called in background done 

Помимо этого, имея параллельный перенос вместо последовательного, вероятно, не ускорит вашу процедуру, как ожидалось, потому что вы передаете данные по одному и тому же проводу. Кроме того, у вас есть накладные расходы на открытие многих сокетов вместо одного.

Последнее примечание: я предлагаю вам иметь разные файлы журналов, потому что в противном случае все выходные данные из разных ftp будут смешаны.

update : внутренняя функция, вероятно, может быть переписана следующим образом:

 ( echo open $HOST $PORT echo user $USER $PASS echo mkdir $DESTDIR echo mkdir $DESTDIR/$DATEGROUP echo cd $DESTDIR/$DATEGROUP ls | while read filename ; do [[ -f $filename ]] && echo put $filename (( i += 1 )) done echo close echo bye echo "$DATEGROUP send $i files" >&4 ) | ftp -nv >&4 2>&4 
  • Как печатать слева и справа от уже напечатанного вывода
  • Как я запускаю сценарий n раз в одно и то же время и как имитировать семафор?
  • Как scp с регулярными выражениями
  • команда telnet с пользовательской продолжительностью тайм-аута
  • Как фильтровать массив строк в ksh
  • Зачем избегать тривиальных символов в сценарии оболочки?
  • Возвращение массива из функции ksh93
  • Удалить все файлы, созданные до определенной даты
  • Как я могу пропустить пустые файлы с sed?
  • Unix - тест ksh, если несколько переменных равны 0
  • Перенаправление. Что такое «<>», «<&» и «> & -»?
  • Linux и Unix - лучшая ОС в мире.