The UNIX and Linux Forums  


Go Back   O UNIX e Linux Forum > Top Fóruns > Programação Shell Script e
.
google unix.com



Programação Shell Script e Post perguntas sobre ksh, CSH, SH, BASH, Perl, PHP, SED, Awk e outros scripts shell e shell scripts línguas aqui.

Mais UNIX e Linux Fórum Tópicos Você pode achar Helpfull
Fio Thread Starter Fórum Respostas Última postagem
descompactar arquivos gzip especial entre os arquivos de dados normal thepurple Programação Shell Script e 4 11-30-2007 11:17
gzip todos os arquivos em um diretório er_ashu UNIX para Dummies Perguntas & Respostas 2 11-06-2007 09:05
Necessidade de arquivos gzip LARGE LordJezo UNIX para Dummies Perguntas & Respostas 2 05-02-2005 05:18
gzip, múltiplos arquivos smbodnar UNIX para Dummies Perguntas & Respostas 2 11-11-2002 04:29
Dois arquivos criados para cada um? Atama UNIX para Dummies Perguntas & Respostas 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 Pesquisar este Thread Rate Thread Display Modes
  #1 (permalink)  
Old 10-13-2008
eisenhorn eisenhorn is offline
Usuário
  
 

Join Date: Oct 2008
Posts: 3
Gzip arquivos que são criados

Olá. Eu tenho um script que estou stumped consulta sobre a qual eu espero que possa ajudar a resolver.

Basicamente, eu tenho um ksh script que chama um processo para criar n número de arquivos binários. Estes ficheiros têm um tamanho máximo de 1Gb. O processo pode escrever n número de arquivos de uma vez (operação paralela), com base nas paralellisation parâmetro alimentado no script de início. Normalmente teríamos de esperar para completar este processo e, em seguida, todos os arquivos gzip individualmente (gzip *. dmp, por exemplo). No entanto, em alguns sistemas que não têm espaço em disco suficiente para esperar até que todos os arquivos tenham sido produzidos 1Gb.

Eu tenho escrito previamente alguns códigos para os arquivos gzip em paralelo (ver abaixo), porém, agora eu preciso gzip-los em paralelo, enquanto o primeiro processo é executado. Eu preciso ter cuidado para não tentar qualquer arquivos gzip actualmente a ser escrito (até n paralelo a partir do comando), assim uma espécie de looping será necessária. E eu quero manter a opção de gzip paralelo, se possível.


Código:
...
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

Alguém pode me ajudar a escrever algum código para este usando ferramentas padrão solaris 8/9/10 utilizando o Korn shell. Perl comandos deve ser possível (vers 5.6.1 instalado).

Muitos agradecimentos e Best Regards,
Stephen.
  #2 (permalink)  
Old 10-13-2008
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell programador, autor
  
 

Join Date: Mar 2007
Localização: Toronto, Canadá
Mensagens: 2.362
Citação:
Originally Posted by eisenhorn View Post

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

Não só é -1 desnecessária, mas também o é ls em si. Além disso, ls vai quebrar seu script se existem espaços no arquivo.


Código:
for filename in ${EXP_DIR}/*.dmp

Citação:

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

Usar padrão sintaxe:


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

Citação:

Código:
  echo "gzip ${filename}"
  ( $GZIPCMD ${filename} ) &

Citação a variável, ou o seu script vai quebrar se existem espaços no nome do arquivo (e não há necessidade de parênteses):


Código:
  $GZIPCMD "$filename" &

Citação:

Código:
  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

Que errado com:

[code]
para
Citação:

Código:
 gzip_func
 print "wait ${list_of_pids}"
 wait ${list_of_pids}
 list_of_pids=""
done

Alguém pode me ajudar a escrever algum código para este usando ferramentas padrão solaris 8/9/10 utilizando o Korn shell. Perl comandos deve ser possível (vers 5.6.1 instalado).

Seu código é muito mais complicado do que o que precisa de ser.

Não é clara a partir do seu código como você saber se um arquivo está sendo gravado para terminar de modo que você pode comprimi-la.

Você tem algum controle sobre o processo que está a escrever a arquivos binários?
  #3 (permalink)  
Old 10-14-2008
eisenhorn eisenhorn is offline
Usuário
  
 

Join Date: Oct 2008
Posts: 3
Graças cfajohnson. Vou tentar incorporar as suas recomendações.

No entanto, para o meu verdadeiro problema, o oráculo exportação utilidade (o processo que gera os arquivos binários) irá criar um arquivo e então preenchê-lo com dados até que ele chegue 1Gb de tamanho, então ele irá criar um novo arquivo. Se usamos parallelisation, irá criar n número de processos (um para cada processo paralelo) e preenchê-los. O último binário arquivos criados e poderia provavelmente ser inferior a 1Gb.

O meu pensamento era o de chamar o gzip funções antes da exportação utilidade e, em seguida, tê-lo esperar por arquivos para gzip, ou seja, apenas arquivos gzip se houver mais do que o número paralelo n. Portanto, se paralelo foi definido como 4, apenas a 5. Gzip arquivo.

Pensar-la através, eu achar que é difícil identificar qual o ficheiro que o programa deve gzip gzip como não podemos simplesmente zip de 1Gb em tamanho que ele pode ainda ser escrito acabamento para o arquivo, etc Posso usar algo como fusor para identificar se a exportação ferramenta tem acabado com o arquivo? talvez algum tipo de looping gzip que espera o fusor para retornar nenhum pid para um arquivo de exportação e, em seguida, Fecha-lo? Eu olhei para uma exportação e podemos ver que, quando o utilitário está acabado de escrever o arquivo já não é tão fechaduras isso poderia ser viável.

Eu gostaria de receber as suas ideias.

Atenciosamente.
  #4 (permalink)  
Old 10-14-2008
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell programador, autor
  
 

Join Date: Mar 2007
Localização: Toronto, Canadá
Mensagens: 2.362

Logo que um novo arquivo é criado, você pode gzip o anterior.
  #5 (permalink)  
Old 10-15-2008
eisenhorn eisenhorn is offline
Usuário
  
 

Join Date: Oct 2008
Posts: 3
Citação:
Originally Posted by cfajohnson View Post
Logo que um novo arquivo é criado, você pode gzip o anterior.
Nem o mais esclarecedora declaração mas entendo o que você quer dizer.

Eu fiz alguns jogando e constatou que a exportação programa irá criar um arquivo de 4k inicialmente e, em seguida, pare de utilizá-lo enquanto ele acumula-se uma lista de objetos para exportação. Em seguida, retorna um bloqueio sobre o arquivo e encha o arquivo até o tamanho 1gb.

Eu o meu código modificado para usar uma du fusor e teste para verificar se o arquivo foi maior do que 4k e não estava a ser usado por qualquer usuário. Acho que se eu usar o paralelismo sobre a exportação o programa irá criar n número de ficheiros e, em seguida, preenchê-las, pode começar com arquivos 1,2,3 e 4, mas 1,3, e 4 repente chegar 1Gb por isso cria 5,6,7 para continuar o paralelo tarefas. dossier 2 ainda não está completo (por qualquer motivo).

Arquivos 1,3, e 4, que são agora utilizadas, mas a gzip_func não parecem querer gzip os arquivos até arquivo 2 está também não utilizados - que muitas vezes pode não ser até o final da exportação. Pode você queira dar uma olhada no código abaixo e veja se você pode detectar um erro óbvio? Eu quero o código para realmente começar gzipping quando o 2 testes são aprovadas, se pode apenas 1 arquivo gzip ou até n threads. Qualquer idéias?


Código:
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

Marcadores

Thread Tools Pesquisar este Thread
Pesquisar este Thread:

Pesquisa Avançada
Display Modes Esta taxa Thread
Esta taxa Thread:

Destacamento Regimento
Você não pode postar novas threads
Você não pode postar respostas
Você não pode postar anexos
Você não pode editar suas postagens

BB code é Ligado
Smilies são Ligado
[IMG] código é Ligado
Código HTML é Desligado
Trackbacks são Ligado
Pingbacks são Ligado
Refbacks são Ligado




Todos os horários são GMT -4. A hora é agora 12:31.


Powered by: vBulletinCopyright © 2000 - 2006, Jelsoft Enterprises Limited. Língua Traduções Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
O UNIX e Linux Fóruns Content Copyright © 1993-2009. Todos os Direitos Reserved.Ad Gestão por RedTyger

Content Relevant URLs por vBSEO 3.2.0