Por que meu trabalho cron.d por minuto não é executado?

33

Lancei um monte de dardos tentando obter um script python meu para executar a cada minuto. Então pensei em simplificá-lo para fazer a "coisa mais simples que poderia funcionar" uma vez por minuto (estou executando o debian / testing).

Eu criei um arquivo de linha única em /etc/cron.d/perminute:

* * * * * /bin/touch /home/me/ding_dong

É de propriedade do root e executável (não tenho certeza se algum deles importa). E então eu fiz:

sudo service cron reload

E então sente-se e comece a rodar ls -ltrrepetidamente no meu diretório pessoal ( /home/me). Mas meu arquivo ding_dong nunca aparece. Eu sei que se eu fizer um sudo /bin/touch /home/me/ding_dong, ele aparece imediatamente.

Obviamente faltando algo estúpido aqui.

Travis Griggs
fonte
3
Recarregar o serviço cron daemon para aplicar uma alteração no cron.d é geralmente desnecessário, pois ele redefine o diretório para arquivos novos e atualizados a cada minuto, de qualquer maneira.
Josip Rodin

Respostas:

45

Ao adicionar uma configuração cron em /etc/cron.d/ou em, /etc/crontabvocê deve adicionar o nome de usuário em que contexto o comando deve ser executado, no seu exemplo

* * * * * root /bin/touch /home/me/ding_dong

E apenas uma dica minha: você não precisa começar a executar ls -ltrrepetidamente, basta usar watch -n 5 "ls -ltr"e ele executará o comando a cada 5 segundos (ou qualquer outro valor substituindo 5 pelo que você deseja).

noggerl
fonte
9
Isso me levou na direção correta. Foi um momento emocionante. Eu consertei e ainda assim não funcionou. Depois de ler man cronum pouco mais devagar, e prestando atenção especial às DEBIAN specificseções, notei que os arquivos NÃO devem ser agrupados ou graváveis. O que eu havia permitido em minha frustração em um ponto.
Travis Griggs
Você também não pode mudar o proprietário do script para root?
Geremia
Essa linha específica me ajudou. De man cron: Além disso, no Debian, o cron lê os arquivos no diretório /etc/cron.d. O cron trata os arquivos em /etc/cron.d da mesma maneira que o arquivo / etc / crontab (eles seguem o formato especial desse arquivo, ou seja , incluem o campo do usuário ). No entanto, eles são independentes de / etc / crontab: eles não herdam, por exemplo, configurações de variáveis ​​de ambiente. Esta mudança é específica para o Debian, veja a nota em DEBIAN SPECIFIC abaixo.
harperville
O man 8 cron (no Debian) também diz que os arquivos em /etc/cron.d/ podem conter apenas caracteres alfanuméricos, '-' e '_'. Especificamente, sem pontos.
Mpartel 17/05
3

Para criar um novo crontrabalho, você deve executar crontab -ecomo o usuário que deseja executar o trabalho. Em seguida, adicione a linha relevante na janela do editor que aparece:

* * * * * /bin/touch /home/me/ding_dong

A maneira como você faz isso requer um formato diferente e, de qualquer maneira, não é uma boa ideia. Os crontabs /etc/cron.dtêm um formato um pouco diferente, exigem que um nome de usuário seja executado. Por exemplo:

* * * * * USERNAME /bin/touch /home/me/ding_dong

Um bom truque (como sugerido por @VogonPoetLaureate) é capturar o erro padrão de seus trabalhos cron, o que pode ajudar a depurá-los. Por exemplo:

* * * * * /bin/touch /home/me/ding_dong 2>/tmp/error
Terdon
fonte
6
Não há absolutamente nenhuma razão para dizer que o cron.d "não é uma boa ideia". O daemon cron enviará a saída cron.d stderr para o nome de usuário, e se você desejar redirecioná-la para outro endereço de email, a variável MAILTO estará disponível.
Josip Rodin
@ JosipRodin não é uma boa ideia para coisas que não são executadas pela raiz e que são configuradas por você. Faz sentido para um administrador de sistemas em um sistema multiusuário, mas em sua própria máquina, é mais simples ter tudo em seu próprio crontab, para que haja apenas um lugar para verificar e crontab -llistar todos os seus trabalhos cron.
terdon
Isso pressupõe que é realmente apenas uma tarefa cron pessoal, que o OP realmente não esclareceu - geralmente, existem vários aplicativos para tarefas cron de usuários sem privilégios configurados via cron.d, como mantê-los em um só lugar, apesar de você ter usuários do serviço sequestradas, implantação automatizada é mais fácil, etc.
Josip Rodin
@JosipRodin absolutamente. Eu assumi um sistema pessoal porque i) sistemas corporativos estão fora de tópico aqui e ii) a pergunta sugeria um usuário não especialista.
terdon 25/09/15
OK, eu acho que eu não ler em que, por causa de confusão comum entre superusuário e serverfault e sites de unix SE :)
Josip Rodin
2

Um possível erro aqui é como um arquivo de linha única é criado. Da documentação do Ubuntu :

... linha possui cinco campos de data e hora, seguidos por um comando, seguido por um caractere de nova linha .

Por exemplo, este caminho da criação não funciona:

printf "* * * * * /bin/touch /home/me/ding_dong" > /etc/cron.d/ding_dong
okoloBasii
fonte