ATENÇÃO : Eu li todas as perguntas semelhantes re. cron, paths, env variables e assim por diante, mas não encontrei nenhum que oferecesse soluções para meu problema específico.
Eu tenho um script que faz alguns despejos do MySQL e depois 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 cron é root.
Notas de depuração
Se eu executar manualmente o script no qual o comando aparece, ele os exclui conforme o esperado.
Se eu executar o comando find acima sozinho na linha de comando como root, ele os excluirá conforme o esperado (e com -print retornará uma lista de arquivos com mais de 5 dias conforme o esperado)
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 canalizar a operação de localização para um arquivo de log,
ele ficará vazio ou não será criado.Estou usando o servidor Ubuntu 14.04.03 LTS.
O problema é que
crontab
não tem$PATH
definido quando é executado. Na verdade, você pode fornecer um caminho adicionando-o ao topo do arquivo aberto por meio decrontab -e
:(ou o que
PATH
você preferir usar). Isso significa que você pode evitar especificar os caminhos completos para os comandos, diretamente do cron.Existem vários problemas com seu comando original. Você está basicamente pedindo ao shell para fazer a expansão curinga, em vez de
find
. Em segundo lugar, você não está fornecendo um caminho completo pararm
; use/bin/rm
ou/usr/bin/rm
, onde quer que esteja localizado em seu sistema (consultewhich rm
).O primeiro argumento para localizar é o "local de pesquisa" 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 é:ou
Se você não especificar a
PATH
definição como acima, use:ou
Tente isso em vez disso
Se eu chamar o comando find diretamente do crontab do root e não como parte do script, ele funcionará.
O script em questão usa csh. Acredito que o ambiente cron do root no Ubuntu estará usando /bin/bash (ou /bin/dash?). Talvez isso entre em conflito de alguma forma com a forma como o comando find estava sendo executado.
De qualquer forma, o problema principal foi resolvido, embora um tanto deselegante.
Caro Crontab usa shell sh em vez de bash por padrão. você pode usar /dev/null para esvaziar arquivos. verifique o script abaixo. isso vai ajudar.
explicação: por favor, use o loop for para acessar todos os arquivos das pastas de destino e torná-los nulos e mover para o diretório / tmp por último