![]() |
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.
|
|
google unix.com
|
|||||||
| Forum | Registrera | Forum Regler | Länkar | Album | FAQ | Medlemslista | Kalender | Söka | Dagens inlägg | Markera forum som lästa |
| 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 |
![]() |
|
|
LinkBack | Thread Tools | Sök i denna tråd | Rate Thread | Visningslägen |
|
|
|
||||
|
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
Många tack och Best Regards, Stephen. |
|
||||
|
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. |
|
||||
|
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
|
![]() |
| Komihåglista |
| Thread Tools | Sök i denna tråd |
| Visningslägen | Betygsätt denna tråd |
|
|