ATENÇÃO : Li todas as perguntas semelhantes sobre re. cron, caminhos, variáveis env e assim por diante, mas não encontraram nenhum que ofereça soluções para o meu problema específico.
Eu tenho um script que faz alguns despejos do MySQL e 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 excluirá conforme o esperado.
Se eu executar o comando find acima por conta própria a partir da linha de comando como root, ele os excluirá conforme o esperado (e com -print ele retornará uma lista de arquivos com mais de 5 dias conforme o esperado)
Também adicionei uma declaração explícita do caminho 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.
/usr/bin/find /home/bkp/dbdump/*.gz -mtime +5
cron
Os comandos são executados no shell e o shell expande curingas.cron
deve enviar email com mensagens de saída e erro. Você recebe algum e-mail desse trabalho?Respostas:
O problema é que
crontab
não foi$PATH
definido quando é executado. Na verdade, você pode fornecer um caminho adicionando isso ao topo do arquivo aberto viacrontab -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 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 pararm
; use/bin/rm
ou/usr/bin/rm
, onde quer que esteja localizado no seu sistema (consultewhich rm
).O primeiro argumento para localizar é o "local a pesquisar" 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
fonte
$PATH
definido, mas será o padrão do sistema. Isso incluirá/usr/bin
e/bin
, portanto, deve ser capaz de encontrar orm
comando.Tente isso em vez disso
fonte
-maxdepth 1
.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. Eu acredito que o ambiente cron da raiz no Ubuntu estará usando / bin / bash (ou / bin / dash?). Talvez isso entre em conflito com o funcionamento do comando find.
De qualquer forma, a principal questão foi resolvida, embora de maneira um tanto deselegante.
fonte