The UNIX and Linux Forums  

Go Back   Die UNIX-und Linux-Foren > Top Foren > Shell Programmierung und Scripting
.
Google unix.com



Shell Programmierung und Scripting Post Fragen zu ksh, csh, sh, bash, Perl, PHP, sed, awk und anderen Shell-Skripte und Shell-Scripting-Sprachen hier.

Mehr UNIX-und Linux-Forum Themen Vielleicht finden Sie hilfreiche
Faden Thread Starter Forum Antworten Last Post
gzip-Dateien entpacken insbesondere unter den normalen Daten-Dateien thepurple Shell Programmierung und Scripting 4 11-30-2007 11:17 AM
gzip alle Dateien in einem Verzeichnis er_ashu UNIX for Dummies Questions & Answers 2 11-06-2007 09:05 AM
Müssen gzip Große Dateien LordJezo UNIX for Dummies Questions & Answers 2 05-02-2005 05:18 PM
gzip, mehrere Dateien smbodnar UNIX for Dummies Questions & Answers 2 11-11-2002 04:29 PM
Zwei Dateien, die für alle? Atama UNIX for Dummies Questions & Answers 1 04-12-2002 05:44 PM

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Suche diesen Thread Rate Thread Anzeige-Modi
  #1 (permalink)  
Old 10-13-2008
eisenhorn eisenhorn is offline
Registrierte Nutzer
  
 

Join Date: Oct 2008
Beiträge: 3
Gzip-Dateien, wie sie erstellt

Hallo. Ich habe eine Scripting-Abfrage, dass ich ratlos bin, an dem ich hoffe, Sie können mit helfen.

Grundsätzlich habe ich ein Skript, ksh fordert einen Prozess zu schaffen n Zahl der binären Dateien. Diese Dateien haben eine maximale Größe von 1 GB. Der Prozess kann schreiben n Anzahl der Dateien auf einmal (Parallel-Betrieb) auf der Grundlage der paralellisation Parameter in das Skript an den Start. Im Normalfall würden wir warten, bis dieser Prozess abgeschlossen und dann gzip alle Dateien einzeln (gzip *. dmp zum Beispiel). Jedoch auf einigen Systemen wir haben nicht genug Speicherplatz zu warten, bis alle Dateien 1Gb wurden.

Ich habe zuvor einige gzip-Code, um die Dateien parallel (siehe unten), aber ich muss jetzt gzip parallel, während sie in den ersten Prozess läuft. Ich muss darauf achten, nicht zu versuchen, alle Dateien gzip derzeit geschrieben (bis zu n aus dem parallel-Kommando), so eine Art Endlosschleife erforderlich. Und ich will, um die Möglichkeit, parallel gzip, wenn möglich.


Code:
...
gzip_func() {
started=0
threads=4
for filename in `ls -1 ${EXP_DIR}/*.dmp`
do
 if [[ ${started} -lt ${threads} ]]; then
  let started=started+1
  echo "gzip ${filename}"
  ( $GZIPCMD ${filename} ) &
  list_of_pids="${list_of_pids} $!"
 else
  print "wait ${list_of_pids}"
  wait ${list_of_pids}
  list_of_pids=""
  started=0
 fi
done
}
...
my_binary_file_creation_process
...
while [ `find ${EXP_DIR} -name \*.dmp|wc -l` -gt "0" ]; do
 gzip_func
 print "wait ${list_of_pids}"
 wait ${list_of_pids}
 list_of_pids=""
done

Kann jemand mir helfen, schreiben Code für diese Verwendung von Standard-Solaris 8/9/10 Werkzeuge mit der Korn-Shell. Perl Befehle sollte möglich sein, (Vers. 5.6.1 installiert ist).

Vielen Dank und Beste Grüße,
Stephen.
  #2 (permalink)  
Old 10-13-2008
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell-Programmierer, Autor
  
 

Join Date: März 2007
Ort: Toronto, Kanada
Beiträge: 2378
Zitat:
Zitat von eisenhorn View Post

Code:
...
gzip_func() {
started=0
threads=4
for filename in `ls -1 ${EXP_DIR}/*.dmp`

Nicht nur ist -1 unnötig, aber so ist ls sich. Auch, ls wird Ihr Skript, wenn es keine Leerzeichen im Dateinamen.


Code:
for filename in ${EXP_DIR}/*.dmp

Zitat:

Code:
do
 if [[ ${started} -lt ${threads} ]]; then
  let started=started+1

Verwenden Sie Standard-Syntax:


Code:
 if [ ${started} -lt ${threads} ]; then
 started=$(( $started + 1 ))

Zitat:

Code:
  echo "gzip ${filename}"
  ( $GZIPCMD ${filename} ) &

Zitat die Variable, oder Ihr Skript wird brechen, wenn es Leerzeichen im Dateinamen (und es gibt keine Notwendigkeit für die Klammern):


Code:
  $GZIPCMD "$filename" &

Zitat:

Code:
  list_of_pids="${list_of_pids} $!"
 else
  print "wait ${list_of_pids}"
  wait ${list_of_pids}
  list_of_pids=""
  started=0
 fi
done
}
...
my_binary_file_creation_process
...
while [ `find ${EXP_DIR} -name \*.dmp|wc -l` -gt "0" ]; do

Was falsch mit:

[code]
für
Zitat:

Code:
 gzip_func
 print "wait ${list_of_pids}"
 wait ${list_of_pids}
 list_of_pids=""
done

Kann jemand mir helfen, schreiben Code für diese Verwendung von Standard-Solaris 8/9/10 Werkzeuge mit der Korn-Shell. Perl Befehle sollte möglich sein, (Vers. 5.6.1 installiert ist).

Ihr Code sieht weitaus komplizierter, als sie sein muss.

Es ist nicht klar, aus dem Code, wie Sie sagen, ob eine Datei fertig geschrieben, so dass Sie sie komprimieren.

Haben Sie die Kontrolle über den Prozess, schreibt die binäre Dateien?
  #3 (permalink)  
Old 10-14-2008
eisenhorn eisenhorn is offline
Registrierte Nutzer
  
 

Join Date: Oct 2008
Beiträge: 3
Dank cfajohnson. Ich werde versuchen, Ihre Empfehlungen.

Doch für meine eigentliche Problem, die Oracle-Export-Programm (der Prozess, der die Binär-Dateien) erstellt eine Datei und dann füllt sie mit Daten von bis zu 1 GB groß sind, dann wird es eine neue Datei. Wenn wir Parallelisierung, wird es schaffen n Anzahl der Dateien (eine für jede Parallel-Prozess) und füllen Sie sie. Die endgültige binäre Dateien erstellt, und wahrscheinlich wäre weniger die 1Gb.

Mein Gedanke war, um die gzip Funktion vor dem Export Utility und dann haben sie warten auf gzip-Dateien, dh nur gzip-Dateien, wenn es mehr als die Anzahl parallel n. Also, wenn parallel wurde auf 4, nur der 5. gzip-Datei.

Denken sie durch, ich finde es schwer zu erkennen, welche Datei das Programm gzip sollte gzip, wie wir können nicht nur ZIP-Dateien von 1 GB Größe, da es noch werden Weiterverarbeitung schriftlich zu den Akten, usw. Kann ich so etwas wie Fixiereinheit zu ermitteln, wenn die Export-Tool ist fertig mit der Datei? vielleicht irgendeine Form von looping gzip erwartet, dass die Fixiereinheit wieder keine PID für eine Export-Datei und dann Reißverschlüsse es? Ich habe mir bei einem Export und können sehen, dass, wenn das Programm fertig ist das Schreiben der Datei nicht mehr gesperrt ist, so könnte dies möglich sein.

Ich würde es begrüßen, Ihre Ideen.

Mit besten Grüßen.
  #4 (permalink)  
Old 10-14-2008
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell-Programmierer, Autor
  
 

Join Date: März 2007
Ort: Toronto, Kanada
Beiträge: 2378

Sobald eine neue Datei erstellt wird, können Sie gzip die vorherige.
  #5 (permalink)  
Old 10-15-2008
eisenhorn eisenhorn is offline
Registrierte Nutzer
  
 

Join Date: Oct 2008
Beiträge: 3
Zitat:
Zitat von cfajohnson View Post
Sobald eine neue Datei erstellt wird, können Sie gzip die vorherige.
Nicht die erleuchtenden Erklärung aber ich verstehe was du meinst.

Ich habe dazu ein paar Spiel-und festgestellt, dass die Ausfuhr-Programm erstellt eine Datei von 4k zunächst, dann stoppen Sie es, während es baut eine Liste von Objekten für den Export. Es liefert dann eine Sperre für die Datei und füllt die Datei bis zu der Größe von 1 GB.

Ich veränderte mein Code für die Verwendung eines du und Fixiereinheit Test um zu prüfen, ob die Datei größer als 4k und wurde nicht von jedem Benutzer. Ich finde, dass, wenn ich Parallelität der Ausfuhr wird das Programm erstellen n Anzahl der Dateien und dann bevölkern sie, es kann Dateien mit 1,2,3 und 4, sondern 1,3, und 4 erreichen 1Gb plötzlich so schafft 5,6,7, die parallel Aufgaben. Datei 2 ist noch nicht vollständig (aus welchem Grund auch immer).

Dateien 1,3 und 4 sind jetzt nicht genutzte, aber die gzip_func scheint nicht zu wollen, bis die Dateien gzip Datei 2 ist auch nicht genutzte -, die oft vielleicht nicht bis zum Ende der Export. Können Sie bitte einen Blick auf den Code unten und sehen Sie, ob Sie vor Ort ein offensichtlicher Fehler? Ich möchte, dass der Code wirklich gzipping beginnen, wenn die 2 tests werden, unabhängig davon, ob es nur 1 Datei gzip oder bis zu n Fäden. Irgendwelche Ideen?


Code:
gzip_func() {
started=0
threads=4
for filename in ${EXP_DIR}/*.dmp
do
 # Check if file is bigger than 8K and is not being used
 if [ `du -sk "${filename}"|awk '{print $1}'` -gt "8" ] && [ `fuser "${filename}" 2>/dev/null | wc -m` -eq "0" ]; then
   # Loop through files until 4 are started (to match threads)
   if [ ${started} -lt ${threads} ]; then
    started=$(( $started + 1 ))
    echo "gzip ${filename}"
    $GZIPCMD "${filename}" &
    list_of_pids="${list_of_pids} $!"
   else
    print "wait ${list_of_pids}"
    wait ${list_of_pids}
    list_of_pids=""
    started=0
   fi
 else
   echo "${filename} is still being written to, trying next file..."
 fi
done
}
 
# Export creation - note done in background to allow gzip loop to run
expdp '"/ as sysdba"' directory=DPUMP_DIR_ADHOC dumpfile=ram6_full%U.dmp logfile=ram6_full.log filesize=1024m full=y parallel=4 &
 
while [ `find ${EXP_DIR} -name \*.dmp|wc -l` -gt "0" ]; do
 gzip_func
 print "out of loop wait ${list_of_pids}"
 wait ${list_of_pids}
 list_of_pids=""
 sleep 5
done

Closed Thread

Lesezeichen

Thread Tools Suche diesen Thread
Suche diesen Thread:

Erweiterte Suche
Anzeige-Modi Rate this thread
Rate this thread:

Forumregeln
Du möglicherweise nicht neue Themen
Du möglicherweise nicht nach Antworten
Du möglicherweise nicht post-Anlagen
Du möglicherweise nicht bearbeiten Sie Ihre Beiträge

BB-Code ist Auf
Smilies sind Auf
[IMG] Code Auf
HTML-Code ist Aus
Trackbacks sind Auf
Pingbacks sind Auf
Refbacks sind Auf




Alle Zeiten sind GMT -4. Es ist jetzt 01:51 PM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Ltd. Sprachliche Übersetzungen Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
Die UNIX-und Linux-Foren Content © Copyright 1993-2009. Alle Rechte Reserved.Ad Management von RedTyger

Content Relevant URLs durch vBSEO 3.2.0