BASH несколько вложенных IF внутри DO - PullRequest
0 голосов
/ 31 октября 2011

Сценарий, который я пытаюсь написать, должен сделать следующее

Перейдите в определенный каталог и найдите все файлы с расширением *.mp4, которое новее 30 минут, и переместите их в переменную.

Все файлы в переменной должны быть загружены на FTP, и по электронной почте отправляется уведомление. В следующем случае нужно будет просмотреть файлы и найти все файлы с расширением *1280x720_3500_h32.mp4, затем эти файлы будут загружены на другой FTP-сервер.

Наконец, сценарий должен переместить все файлы в отдельное место в сети для архивирования.

Затем процесс должен запускаться каждые 30 минут. Вот почему я добавил отдельный скрипт, который запускает 30-минутный процесс сна и вызывает первоначальный скрипт. В сущности, у меня есть скрипт Upload и скрипт сна. Поэтому на ум приходят два вопроса:

  1. Я не уверен насчет второго IF, где сценарий ищет все файлы *1280x720_3500_h32.mp4 - будет ли он загружать все файлы с этим именем, которое не старше 30 минут
  2. Условия гонки, при которых скрипт попытается загрузить файлы, которые уже были обработаны, или пропустит файлы?

Сценарий сна:

#!/bin/bash
ScripLocal='/Users/jonathan/scripts/Event_Scripts'

while true
do
echo "running Upload script: find_newerthan_mv_toFtp_v2.sh" 
cd $ScripLocal
. find_newerthan_mv_toFtp_v2.sh
echo "finished running script: ffind_newerthan_mv_toFtp_v2.sh - next run is in 30 minutes"
sleep 30m
done 

Скрипт загрузки:

#!/bin/bash
#File Origin
GSPORIGIN='/Volumes/HCHUB/Episode/Watchfolders/Output/Profile_01/'
#To location on the SAN where the files are being stored
DESTDIRSAN='/Volumes/HCHUB/Digitalmedia/online_encodes'

# 1st FTP Details
HOST='ftp.upload01.com'
USER='xxxx'
PASSWD='xxxx'
DESTDIR="/8619/_!/intlod/upload/"

#2nd FTP details
HOST01='ftp.upload02.com'
USER01='xxxx'
PASSWd01='xxxx'


cd $GSPORIGIN
for file in `find . -type f -name "*.mp4" -mmin -30`
do 
echo $file
if [ -f $file ] ; then
echo "Uploading to FTP 01"
ftp -n -v $HOST << EOT
ascii
user $USER $PASSWD
prompt
cd $DESTDIR
mput $file
EOT
echo "$file has been copied to FTP 01" | mail -s "$file has been copied to FTP 01 in      Directory $DESTDIR"  xxxx@xxxx.com xxxx@xxxx.com xxxx@xxxx.com; 
if [[ $file == *1280x720_3500_h32.mp4 ]] ; then
echo "Uploading FTP 02 version"
ftp -n -v $HOST01 << EOT
ascii
user $USER01 $PASSWD01
prompt
mput $file
EOT
echo "$file has been copied to FTP 02" | mail -s "$file has been copied to FTP 02"   xxxx@xxxx.com; 
fi
echo "moving files to SAN $DESTDIRSAN"
mv -v $file $DESTDIRSAN
else exit 1
fi
done

Ответы [ 3 ]

3 голосов
/ 31 октября 2011

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

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

Кроме того, он может использовать ssh для защиты соединения, поэтому вам не нужно отправлять простые текстовые пароли по сети (это очень плохая идея сегодня даже в Интранете).

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

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

mkdir .lock || { echo "Can't lock - process is already running" ; exit 1 ; }
trap "rmdir .lock" EXIT

Возможно, вы также захотите взглянуть на FTAPI , который делает все это и многое другое.

2 голосов
/ 31 октября 2011

Используйте crontab, а не спящие темы. sleep подвержен сбоям, а nohup пинг - это все равно хлопот.

Используйте rsync вместо того, чтобы искать изменения самостоятельно, если вы вообще можете. Кроме того, вам не нужно сценарий rsync, как вы делаете с ftp.

0 голосов
/ 01 ноября 2011

Получил вариацию скрипта на python (спасибо, Дэниел !!).

#!/usr/bin/python
# Created in a rush, on the 31st October

# HALLOWEEN SPECIAL - QUICK AND DIRTY
import os
import shutil
from ftplib import FTP

# File Origin
ENCODE_OUTPUT='xxxxxxx'
# To location on the SAN where the files are being cached on the network
CACHE_DIR='xxxxxxxx'

#ENCODE_OUTPUT='encode/'
#CACHE_DIR='cache/'

#FTP01 FTP Details
FTP01_HOST='upload.FTP01.com'
FTP01_USER='xxxxx'
FTP01_PASSWD='xxxxxxx'
FTP01_DESTDIR="dir/dir/"

#Fingerprinting FTP details
FINGERPRINT_HOST='ftp.ftp02.com'
FINGERPRINT_USER='xxxxx'
FINGERPRINT_PASSWD='xxxxxx'
FINGERPRINT_DEST_DIR='/'

dirList = os.listdir(ENCODE_OUTPUT)
dirList.sort()

# Move the files out of the encoded located and into the cache dir
for video_file in dirList:
            print "Moving file %s to %s" % (video_file, CACHE_DIR)
        shutil.move(ENCODE_OUTPUT + video_file, CACHE_DIR)

        # Upload the file to FTP01
        print "Logging into %s FTP" % FTP01_HOST
        ftp = FTP(FTP01_HOST)
        ftp.login(FTP01_USER, FTP01_PASSWD)
        ftp.cwd(FTP01_DESTDIR)

        print "Uploading file %s to %s" % (video_file, FTP01_HOST+FTP01_DESTDIR)
        ftp.storbinary('STOR ' + FTP01_DESTDIR+video_file, open(CACHE_DIR+video_file, "rb"), 1024)

        # Close the connection
        ftp.close

        # If the file ands in "1280x720_3500_h32.mp4" copy it to the finger printing service
            if video_file[-21:]=="1280x720_3500_h32.mp4":
                # Upload the file to the fingerprinting service
                print "File is HD. Logging into %s FTP" % FINGERPRINT_HOST
                ftp = FTP(FINGERPRINT_HOST)
                ftp.login(FINGERPRINT_USER, FINGERPRINT_PASSWD)
                ftp.cwd(FINGERPRINT_DEST_DIR)

                print "Uploading file %s to %s" % (video_file, FINGERPRINT_HOST)
                ftp.storbinary('STOR ' + FINGERPRINT_DEST_DIR+video_file, open(CACHE_DIR+video_file, "rb"), 1024)

                ftp.close
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...