Scripts não estão funcionando corretamente no UNIX

2

Eu tenho um script1 que tem cerca de 60 linhas semelhantes a este

mv /log/ports-01/Homepage.log.$a /log/Backup/ports-01/

Também tenho outro script2 que tem um conjunto de comandos como este para todos os comandos de movimento no script1 acima

tar -cvf /log/Backup/ports-01/Homepage_$a.tar /log/Backup/ports-01/Homepage.log.$a
gzip /log/Backup/ports-01/Homepage_$a.tar
rm -f /log/Backup/ports-01/Homepage.log.$a

O Script2 é executado após 2 horas a partir da execução do script1. Parece não haver problema com a estrutura de diretórios.

Mas o problema é que nem todos os logs estão sendo movidos e tarrados. Também muitos arquivos tar que são criados estão vazios, mas os arquivos de logs são excluídos.

Também quero perguntar se há algum problema em ter tantas linhas em um script.

    
por Hawks 17.11.2011 / 08:42

3 respostas

2

Pelo que eu poderia deduzir, o problema pode ser a variável 'a'. Experimente

mv /log/ports-01/Homepage.log."$a" /log/Backup/ports-01/

Ou seja, tente citar a referência de variável (certifique-se de fazer isso com todas as ocorrências da variável. Além disso, como dica, você pode usar a opção z do utilitário tar para criar o tarball diretamente, assim: tar czvf /path/to/ball.tar.gz /path/to/dir

    
por 17.11.2011 / 08:50
1

Bem, se for executado corretamente quando você executá-lo manualmente, então provavelmente há problemas com variáveis de ambiente, verifique se o seu script depende de algumas variáveis de ambiente que você não possui no ambiente CRON.

Além disso, se você executar dois scripts e o segundo depender primeiro, execute-os um após o outro, como:

0 */2 * * *  /home/username/first_script; /home/username/second_script

É trivial, mas apenas para verificar.

Se você não encontrar resposta dessa maneira, você pode usar o comando "logger" para armazenar logs de todas as etapas de seus scripts e tentar capturar seus bugs dessa maneira.

    
por 18.11.2011 / 12:18
1
Primeiro, não há problema em ter um script com mais de 60 linhas - eu lidei com roteiros de shell que possuem centenas de linhas, o shell não se importa.

Sem mais informações (mostre-nos suas entradas / entradas no crontab, e todo o script sendo executado - como isso é " $a " populado? Ele contém espaços? etc.) é difícil dar uma resposta boa e definitiva por que isso não está funcionando, mas posso te dar um pouco de reflexão:

Eu tenho um problema com a maneira como você executa seus scripts: Usar o tempo para separar as ações dependentes é uma receita para o desastre. Dependendo do tamanho desses arquivos, da lentidão dos discos, do cruzamento de partições etc. etc., é possível que o primeiro script não esteja terminando quando o segundo script for executado. Isso tem duas implicações principais:

  1. Script 1 ainda pode mover arquivos enquanto Script 2 está fazendo o tarball.
  2. Script 2 é apenas tar das coisas que vê quando executa o comando tar .
    • Script 2 também é rm do que ele vê quando chega ao comando rm - Isso pode significar que está excluindo coisas que não foram adicionadas ao tarball
    • Se o Script 1 ainda estiver em execução, você terá arquivos "perdidos" copiados depois que o rm estiver pronto. Eles ficarão por aqui.

@ A sugestão de XoR de encadear os scripts no cron é uma maneira de se proteger. Então, combinar os dois scripts em um script maior.
Usando arquivos de bloqueio (o Linux tem o comando lockfile (1) ; acredito que a maioria dos BSDs tem lockf ( 1) ) é outra opção, e é um pouco mais robusta do que encadear scripts juntos no cron.

    
por 18.11.2011 / 20:55

Tags