shell script en bash pour télécharger le fichier à partir du serveur ftp
je dois écrire un script shell pour le shell bash pour transférer des fichiers à partir d'un serveur ftp
étant donné
serveur ftp -- [email protected]
l'utilisateur user1
mot de passe rapidair1
maintenant dans /dir1/dir2 au serveur ftp j'ai un dossier dans les formes suivantes
0.7.1.70
0.7.1.71
0.7.1.72
j'ai copier le fichier "file1.iso" dans le dernier dossier que j'.e 0.7.1.72 dans ce cas.
je dois aussi vérifier l'intégrité du fichier en cours de copie je.e supposons que les fichiers sont téléchargés vers le serveur et à l'époque, si je commence à copier dans ce cas, la copie ne sera pas complet.
je dois faire après toutes les 4 heures . cela peut être fait en en faisant une tâche cron. s'il vous plaît aider
je l'ai fait
j'ai monté le serveur ftp le dossier de ma machine locale . pour vérifier si le fichier a été complètement chargé ou pas je suis la vérification de la taille après chaque 50 sec pour 5 fois si c'est la même chose, alors je suis la copie c'est le contraire d'exécuter le script après 4 heures...
j'ai maintenu un fichier texte "foldernames.txt" nom de tous ces dossiers à partir de laquelle j'ai copié le fichier requis .. je suis donc de vérifier si un nouveau dossier est ajouté au serveur en vérifiant son nom dans le nom du dossier.fichier texte ..
**
tout fonctionne parfaitement, le seul problème est maintenant .. supposons que le fichier a été téléchargé à cette époque, il y avait une certaine défaillance du réseau.. comment vais-je m'assurer que j'ai téléchargé le fichier .... j'ai essayé d'utiliser md5sum et chksum mais il prenait de temps à calculer le montage de dossier. s'il vous plaît aider
voici mon script ..
#!/bin/bash
#
# changing the directory to source location
echo " ########### " >> /tempdir/pvmscript/scriptlog.log
echo `date`>> /tempdir/pvmscript/scriptlog.log
echo " script is strting " >> /tempdir/pvmscript/scriptlog.log
cd /var/mountpt/pvm-vmware
#
# array to hold the name of last five folders of the source location
declare -a arr
i=0
for folder in `ls -1 | tail -5 `; do
arr[i]=$folder
#echo $folder
i=$((i+1))
done
echo " array initialised " >> /tempdir/pvmscript/scriptlog.log
#
#now for these 5 folders we will check if their name is present in the list of copied
# folder names
#
echo " checking for the folder name in list " >> /tempdir/pvmscript/scriptlog.log
## $(seq $((i-1)) -1 0
for j in $(seq $((i-1)) -1 0 ) ; do
var3=${arr[$j]}
#var4=${var3//./}
echo " ----------------------------------------" >> /tempdir/pvmscript/scriptlog.log
echo " the folder name is $var3" >> /tempdir/pvmscript/scriptlog.log
#
# checking if the folder name is present in the stored list of folder names or not
#
#
foldercheck=$(grep $var3 /tempdir/pvmscript/foldernames.txt | wc -l)
#
if test $foldercheck -eq 1
then
echo " the folder $var3 is present in the list so will not copy it " >> /tempdir/pvmscript/scriptlog.log
foldercheck=" "
continue
else
#
echo " folder $var3 is not present in the list so checking if it has the debug.iso file ">> /tempdir/pvmscript/scriptlog.log
#enter inside the new folder in source
#
cd /var/mountpt/pvm-vmware/$var3
#
# writing the names of content of folder to a temporary text file
#
ls -1 > /var/temporary.txt
#checking if the debug.iso is present in the given folder
var5=$(grep debug.iso /var/temporary.txt | wc -l)
var6=$(grep debug.iso //var/temporary.txt)
#
check1="true"
#
# if the file is present then checking if it is completely uploaded or not
#
rm -f /var/temporary.txt
if test $var5 -eq 1
then
echo " it has the debug.iso checking if upload is complete ">>/tempdir/pvmscript/scriptlog.log
#
# getting the size of the file we are checking if size of the file is constant or changing # after regular interval
#
var7=$(du -s ./$var6 |cut -f 1 -d '.')
#echo " size of the file is $var7"
sleep 50s
#
# checking for 5 times at a regular interval of 50 sec if size changing or not
#
#
for x in 1 2 3 4 5 ;do
var8=$(du -s ./$var6 |cut -f 1 -d '.')
#
#if size is changing exit and check it after 4 hrs when the script will rerun
#echo " size of the file $x is $var7"
if test $var7 -ne $var8
then
check1="false"
echo " file is still in the prossess of being uploadig so exiting will check after 4 hr " >> /tempdir/pvmscript/scriptlog.log
break
fi
sleep 50s
done
#
#if the size was constant copy the file to destination
#
if test $check1 = "true"
then
echo " upload was complete so copying the debug.iso file " >> /tempdir/pvmscript/scriptlog.log
cp $var6 /tempdir/PVM_Builds/
echo " writing the folder name to the list of folders which we have copied " >> /tempdir/pvmscript/scriptlog.log
echo $var3 >> /tempdir/pvmscript/foldernames.txt
echo " copying is complete " >> /tempdir/pvmscript/scriptlog.log
fi
#else
#echo $foldercheck >> /vmfs/volumes/Storage1/PVM_Builds/foldernames.txt
else
echo " it do not have the debug.iso file so leaving the directory " >>/tempdir/pvmscript/scriptlog.log
echo $var3 >> /tempdir/pvmscript/foldernames.txt
echo
fi
#rm -f /var/temporary.txt
fi
done
Hors-sujet pour; appartient à Super-Utilisateur ou éventuellement Serveur de Faute
si vous devez écrire un script shell", vous avez pour nous montrer ce que vous avez fait et pourquoi il ne fonctionne pas. Un Débordement de pile, c'est aider les programmeurs à résoudre leurs problèmes de programmation, ne pas faire le travail de quelqu'un pour eux. Bonne chance.
monsieur, j'ai essayé ce n maintenant, je suis frappé de cette façon de faire en sorte que le script avez copié le fichier . j'ai pensé que je vais comparer la taille des fichiers à la fois sur l'emplacement, mais quand j'ai vérifié la taille des fichiers qui ont été copiés avec succès, ils étaient différents sur les deux emplacement ne peut donc pas le faire . veuillez suggérer des façons de le faire.
OriginalL'auteur puneet | 2012-04-11
Vous devez vous connecter pour publier un commentaire.
Certains commentaires et demandes d'éclaircissements, voir ci-dessous le saut pour une seule réponse possible.
(Beau travail de mise à jour de votre question.)
Quelle est la taille de ces fichiers?
Sont ces fichiers que vous avez aucun contrôle sur le début de leur création (sauvegardes de base de données,par exemple).
Il serait également utile d'avoir un peu plus de détails sur ces fichiers, c'est à dire la taille, MO, GO, to, le PB? et la source qui les crée, db-backup, ou ???.
Sont vos préoccupations théoriques, proactive explorations pour les pires scénarios, ou si vous avez des problèmes réels, à quelle fréquence et quelles en sont les conséquences?
Est votre SLA une irréalistes ou irréalisables gestion de la pipe de rêve? Si oui, alors vous devez commencer à créer de la documentation démontrant que le système actuel nécessitera X quantité supplémentaire de ressources (personnes, matériel, programmation,etc) afin de corriger les lacunes dans votre système.
Si les fichiers transférés sont des fichiers de données créés par un système source, une technique est à la source du système de créer un "drapeau" fichier envoyé après le fichier principal est envoyé.
Il pourrait contenir des détails comme
Donc, maintenant vos systèmes attend à trouver que le drapeau fichier a été livré, parce que vous êtes en utilisant une convention de nommage pour chaque fichier que vous recevez, et vous utilisez un timbre-dateur intégré dans le fichier. Lorsque le fichier arrive, votre script calcule chaque détail et les compare aux valeurs stockées dans le fichier flag.
Si vous ne pouvez pas obtenir ce niveau de détail, à moins générique drapeau de fichier, par jour-par fichier OU par lot quotidien de fichiers (envoyé lorsque tous les fichiers sont fait) pourrait être suivi avec les tests qui comparent les nouveaux fichiers en fonction d'un ensemble de tests qui a du sens pour votre situation particulière, ... certains des éléments suivants:
Alors votre défense est "nous n'avons pas le contrôle complet sur les fichiers, mais nous leur avons vérifié pour X,Y,Z et il a passé ces tests, c'est pourquoi nous avons chargé".
Tout
rsync
pourrait être bon, je ne vois pas comment, compte tenu de certains des scénarios mentionnés, tu avais déjà être sûr qu'il est sûr de commencer à charger le fichier, commersync
pourrait commencer à ajouter plus de données dans le fichier.La lecture de ton texte, si vous ne pouvez pas obtenir une détaillé drapeau fichier à partir de votre source, vous êtes sur la bonne voie. Glenn Jackman solution cherche à atteindre le même objectif avec moins de code. Vous placer à l'intérieur d'un fichier 'getRemotedata.sh" ou similaire, et le mettre dans une boucle while qui seulement se ferme lorsque l' 'getRemotedata.sh sorties avec succès. Je suppose que je voudrais un certain type de notification qu'il a passé 3*normalTime en cours d'exécution. Mais il peut devenir très complexe lorsque vous essayez de couvrir toutes les conditions. Il y a de la 3e partie des outils qui permettent de gérer les téléchargements de fichiers, mais nous n'avons jamais eu le budget pour les acheter, donc je ne peux pas le recommander à tout.
ouf
J'espère que cette aide.
P. S. Bienvenue sur StackOverflow (S. O.) s'il vous Plaît n'oubliez pas de lire la Faq, http://tinyurl.com/2vycnvr , voter pour de bon Q/A en utilisant les triangles gris, http://i.imgur.com/kygEP.png , et à accepter la réponse que bes résout votre problème, le cas échéant, en appuyant sur la coche signe , http://i.imgur.com/uqJeW.png
OriginalL'auteur shellter
Le protocole FTP n'est pas assez robuste. Il ne traite pas de l'atomicité et il n'y a aucun moyen de savoir si un fichier est encore en cours de téléchargement pendant que vous téléchargez. Si vous avez besoin de cette fonctionnalité, vous devez envisager l'utilisation du
rsync
pour à la fois le téléchargement ET le téléchargement.OriginalL'auteur Jim Garrison
OriginalL'auteur glenn jackman