find -delete funciona OK, mas não com o cron

8

ATENÇÃO : Eu li todas as perguntas semelhantes re. cron, caminhos, env variáveis e assim por diante, mas não encontrei nenhum que ofereça soluções para o meu problema particular.

Eu tenho um script que faz alguns dumps do MySQL e, em seguida, exclui os antigos como este:

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -delete

(o comando acima foi modificado do meu comando original por sugestões de comentários )

No entanto, os arquivos nunca são excluídos quando o cron executa esse script. O usuário do cron é root.

Anotações de depuração

  • Se eu executar manualmente o script no qual o comando aparece, ele será excluído conforme o esperado.

  • Se eu executar o comando find acima sozinho a partir da linha de comando como root, ele os excluirá como esperado (e com -print retornará uma lista de arquivos com mais de 5 dias como esperado)

  • Eu também adicionei uma instrução de caminho explícito ao crontab do root, mas
    isso não muda nada.

  • Cron não envia nenhum erro e se eu canalizo a operação de localização para um arquivo de log,
    que surge vazio ou não é criado de todo.

  • Estou usando o servidor Ubuntu 14.04.03 LTS.

por TommyPeanuts 13.12.2015 / 10:05

3 respostas

0

Se eu invocar o comando find diretamente do crontab do root e não como parte do script, então funciona.

O script em questão usa csh. Eu acredito que o ambiente cron do root no Ubuntu estará usando / bin / bash (ou / bin / dash?). Talvez isso conflite de alguma forma com a forma como o comando find estava sendo executado.

De qualquer forma, a principal questão resolvida, embora de forma um pouco deselegante.

    
por 23.12.2015 / 10:37
7

O problema é que crontab não tem $PATH definido quando é executado. Você pode realmente fornecer um caminho adicionando isso ao topo do arquivo aberto via crontab -e :

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

(ou qualquer que seja o PATH que você preferir usar). Isso significa que você pode evitar especificar os caminhos completos para os comandos, diretamente do cron.

Existem vários problemas com o seu comando original. Você está basicamente pedindo ao shell para fazer a expansão de curinga, em vez de find . Em segundo lugar, você não está fornecendo um caminho completo para rm ; use /bin/rm ou /usr/bin/rm , onde quer que esteja localizado em seu sistema (veja which rm ).

O primeiro argumento para encontrar é o "local a ser pesquisado" e, em seguida, você especifica a "consulta de pesquisa" com os vários -<option> s. Portanto, o formato adequado do comando que você deseja executar é:

find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -exec rm -f {} \;

ou

find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete

Se você não especificar a definição PATH como acima, use:

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -exec /bin/rm -f {} \;

ou

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete
    
por 14.12.2015 / 07:13
3

Tente isso

find /home/bkp/dbdump -type f -name '*.gz' -mtime +5 -delete
    
por 13.12.2015 / 10:13

Tags