The UNIX and Linux Forums  
Hej och välkommen från USA till UNIX och Linux Forum! Tack för ditt besök och gå med i vår globala gemenskapen.

Go Back   UNIX och Linux Forum > Upp Forum > Shell-programmering och Skript
.
google unix.com



Shell-programmering och Skript Post frågor om ksh, CSH, SH, bash, PERL, PHP, sed, awk och andra skalskript och skal skriptspråk här.

Mer UNIX och Linux Forum Ämnen Du kan hitta Helpful
Tråd Thread Starter Forum Svar Senaste Inlägg
unzip särskilt gzip filer mellan normal datafiler thepurple Shell-programmering och Skript 4 11-30-2007 11:17
gzip alla filer i en katalog er_ashu UNIX for Dummies Frågor & Svar 2 11-06-2007 09:05
Behov som gzip stora filer LordJezo UNIX for Dummies Frågor & Svar 2 05-02-2005 05:18
gzip, flera filer smbodnar UNIX for Dummies Frågor & Svar 2 11-11-2002 04:29
Två filer som skapats för var och en? Atama UNIX for Dummies Frågor & Svar 1 04-12-2002 05:44

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 Sök i denna tråd Rate Thread Visningslägen
  #1 (permalänk)  
Old 10-13-2008
eisenhorn eisenhorn is offline
Registered User
  
 

Join Date: oktober 2008
Inlägg: 3
Gzip-filer som de är skapade

Hej. Jag har ett manus sökfråga att jag stumped som jag hoppas du kan hjälpa till med.

I grunden har jag en ksh skript som kräver en process för att skapa n Antalet binära filer. Dessa filer har en storlek på högst 1Gb. Processen kan skriva n antalet filer på en gång (parallelldrift) baseras på paralellisation parametrar matas in skriptet i början. Normalt skulle vi vänta på att denna process för att slutföra och sedan gzip alla filer individuellt (gzip *. DMP till exempel). Men på vissa system vi inte har tillräckligt med diskutrymme för att vänta tills alla 1Gb filer har tagits fram.

Jag har tidigare skrivit en del kod för att gzip filer parallellt (se nedan), men jag måste nu gzip dem parallellt samtidigt som den första processen löper. Jag måste vara noga med att inte försöka gzip några filer närvarande skriftligt (upp till n från parallellt kommando), så någon form av looping kommer att krävas. Och jag vill ha kvar möjligheten av parallella gzip om möjligt.

Kod:
...
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
Kan någon hjälpa mig att skriva kod för denna användning av standardiserade Solaris 8/9/10 verktyg använder Korn shell. Perl kommandon bör vara möjligt (vers 5.6.1 installerad).

Många tack och Best Regards,
Stephen.
  #2 (permalänk)  
Old 10-13-2008
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell programmerare, författare
  
 

Join Date: mars 2007
Ort: Toronto, Kanada
Inlägg: 2361
Citat:
Ursprungligen postat av eisenhorn View Post
Kod:
...
gzip_func() {
started=0
threads=4
for filename in `ls -1 ${EXP_DIR}/*.dmp`

Det är inte bara -1 onödigt, men det är ls själv. Även, ls kommer att bryta ditt script om det finns några mellanslag i filnamnen.

Kod:
for filename in ${EXP_DIR}/*.dmp
Citat:
Kod:
do
 if [[ ${started} -lt ${threads} ]]; then
  let started=started+1

Använd standard syntax:

Kod:
 if [ ${started} -lt ${threads} ]; then
 started=$(( $started + 1 ))
Citat:
Kod:
  echo "gzip ${filename}"
  ( $GZIPCMD ${filename} ) &

Citat variabeln eller skriptet kommer att bryta om det finns utrymme i filnamnet (och det finns ingen anledning för parentes):

Kod:
  $GZIPCMD "$filename" &
Citat:
Kod:
  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

Vad för fel på:

[code]
för
Citat:
Kod:
 gzip_func
 print "wait ${list_of_pids}"
 wait ${list_of_pids}
 list_of_pids=""
done
Kan någon hjälpa mig att skriva kod för denna användning av standardiserade Solaris 8/9/10 verktyg använder Korn shell. Perl kommandon bör vara möjligt (vers 5.6.1 installerad).

Din kod ser betydligt mer komplicerat än det behöver vara.

Det är inte klart från din kod hur du berätta om en fil är klar skrivs till så att du kan komprimera den.

Har ni någon kontroll över den process som skriver den binära filer?
  #3 (permalänk)  
Old 10-14-2008
eisenhorn eisenhorn is offline
Registered User
  
 

Join Date: oktober 2008
Inlägg: 3
Tack cfajohnson. Jag ska försöka att ta med era rekommendationer.

Men för min verkliga problemet, Oracle Export (den process som skapar den binära filer) kommer att skapa en fil och sedan fylla den med data fram tills den når 1Gb i storlek, så kommer det att skapa en ny fil. Om vi använder parallelisation kommer det att skapa n antal filer (en för varje parallell process) och fylla dem. Den slutliga binära filer som skapats kunde och troligen skulle vara mindre 1Gb.

Min tanken var att ringa gzip funktion före export verktyget och sedan låta vänta på filer till gzip, dvs endast gzip filer om det finns mer än det parallella antalet n. Så om parallella sattes till 4, endast gzip den 5: e filen.

Att tänka igenom det, jag tycker att det är svårt att identifiera vilken fil gzip ska gzip så vi kan inte bara zip-filer med 1Gb i storlek eftersom det fortfarande skulle kunna avslutande skriva till filen, etc. Kan jag använda något liknande fixeringsenheten att identifiera om exportlicensen verktyg är klar med filen? kanske någon form av looping gzip som väntar på fixeringsenheten återvända någon pid för ett exportfilen och sedan blixtlås det? Jag har tittat på en export och kan se att när verktyget är klar skriver filen inte längre låser det så kan detta vara möjligt.

Jag skulle välkomna dina idéer.

Vänliga hälsningar.
  #4 (permalänk)  
Old 10-14-2008
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell programmerare, författare
  
 

Join Date: mars 2007
Ort: Toronto, Kanada
Inlägg: 2361

Så snart en ny fil skapas kan du gzip den tidigare.
  #5 (permalänk)  
Old 10-15-2008
eisenhorn eisenhorn is offline
Registered User
  
 

Join Date: oktober 2008
Inlägg: 3
Citat:
Ursprungligen postat av cfajohnson View Post
Så snart en ny fil skapas kan du gzip den tidigare.
Inte den mest upplysande uttalande men jag förstår vad du menar.

Jag gjorde vissa spelregler och fann att exportera programmet kommer att skapa en fil av 4k början, sedan slutar att använda det medan man bygger upp en lista med objekt att exportera. Därefter återgår ett lås på filen och fyller filen upp till 1 GB storlek.

Jag ändrade min kod att använda ett du och fixeringsenheten test för att kontrollera att filen var större än 4k och inte används av alla användare. Jag tycker att om jag använder parallelliteten om export programmet kommer att skapa n antalet filer och sedan fylla i dem, det kan börja med filer 1,2,3 och 4, men 1,3 och 4 plötsligt nå 1Gb så det skapar 5,6,7 att fortsätta parallellt uppdrag. fil 2 är fortfarande inte fullt ut (av någon anledning).

Filer 1,3 och 4 är nu oanvända men gzip_func verkar inte vill gzip filerna tills filen 2 är också oanvänd - som ofta inte skulle vara till slutet av export. Kan du ta en titt på koden nedan och se om du ser ett uppenbart fel? Jag vill att koden för att verkligen börja gzipping när 2 tester gått, om det kan bara gzip 1 fil eller upp till n trådar. Några idéer?

Kod:
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

Komihåglista

Thread Tools Sök i denna tråd
Sök i denna tråd:

Avancerad sökning
Visningslägen Betygsätt denna tråd
Betygsätt denna tråd:

Utstationering Regler
Du får inte efter nya trådar
Du får inte efter svar
Du får inte skicka bilagor
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG] kod
HTML-koden är Av
Trackback är
Pingbacks är
Refbacks är




Alla tider är GMT -4. Klockan är nu 12:42.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Översättningar Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX och Linux Forum Innehållet upphovsrättsskyddat © 1993-2009. All Rights Reserved.Ad förvaltning RedTyger

Content Relevant webbadresser från vBSEO 3.2.0