Quero poder adicionar programaticamente um novo trabalho cron, qual é a melhor maneira de fazer isso?
Da minha pesquisa , parece que eu poderia despejar o crontab atual e, em seguida, acrescentar um novo, canalizando-o novamente para o crontab:
(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -
Existe uma maneira melhor?
Respostas:
Sempre funcionou bem para mim.
Você deve considerar um script um pouco mais sofisticado que pode fazer três coisas.
Acrescente uma linha de crontab; assegurando que não existia. Adicionar quando já existe é ruim.
Remova a linha do crontab. Talvez apenas avisando se não existisse.
Uma combinação dos dois recursos acima para substituir a linha crontab.
fonte
A melhor maneira de rodar como root é soltar um arquivo no /etc/cron.d
se você usar um gerenciador de pacotes para empacotar seu software, basta colocar os arquivos nesse diretório e eles serão interpretados como se fossem crontabs, mas com um campo extra para o nome de usuário, por exemplo:
Nome do arquivo:
/etc/cron.d/per_minute
Conteúdo:
* * * * * root /bin/sh /home/root/script.sh
fonte
/etc/cron.d/*
? É difícil saber se algo está funcionando, se é preciso esperar uma hora para verificar!A solução do OP tem um erro, pode permitir que as entradas sejam adicionadas duas vezes, use abaixo para corrigir.
fonte
sort
antesuniq
, por exemplo:(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
uniq
. Use a-u
opção emsort
.Para adicionar algo ao cron
Para remover isso do cron
a esperança ajudaria alguém
fonte
2>&1 | grep -v "no crontab"
porque quando não há crontab, a linha de saídacrontab: no crontab for...
é enviada ao stderr. Não há razão para capturar essa saída, enviá-la para stdout e filtrá-la usando grep. Se seu objetivo é evitar vercrontab: no crontab for...
em sua saída, use2> /dev/null | sort....
.Se você planeja fazer isso em um cenário de execução única, apenas para fazer algo, dê uma olhada em 'at'
fonte
Simplesmente mude o editor para o comando tee:
fonte
Supondo que já exista uma entrada no seu crontab, o comando a seguir deve funcionar relativamente bem. Observe que a
$CMD
variável está lá apenas para facilitar a leitura. A classificação antes de filtrar duplicatas é importante, porqueuniq
funciona apenas em linhas adjacentes.Se você atualmente possui um crontab vazio, receberá o seguinte erro no stderr:
Se você quiser evitar isso, adicione um pouco de complexidade e faça algo assim:
fonte
A maioria das soluções aqui é para adicionar linhas ao crontab. Se você precisar de mais controle, poderá controlar todo o conteúdo do crontab.
Você pode usar a tubulação para fazer isso com bastante elegância.
Para reescrever completamente o crontab, faça
Deve ser fácil combinar com outras respostas descritas aqui, como
Ou, se você tiver o conteúdo de um arquivo, é ainda mais simples
fonte
Aqui está outra maneira de uma linha, que evita duplicatas
E aqui está uma maneira de responder a JohnZ e evitar a
no crontab for user
mensagem, ou se você precisar operar em umset -eu
ambiente de tipo e não puder fazer nada retornar uma falha (nesse caso, a2>/dev/null
peça é opcional):Ou se você deseja dividir as coisas para que sejam mais legíveis:
Ou, opcionalmente, remova qualquer referência ao seu_command (por exemplo: se o agendamento foi alterado, você só deseja que ele seja programado uma vez). Nesse caso, não precisamos mais
uniq
(bônus adicional, o pedido de inserção também é preservado):fonte
O man crontab também é útil:
CRONTAB (1)
NOME
SINOPSE
fonte
Adicionando à resposta de JohnZ, aqui está a sintaxe para agendar como root se você é um sudoer:
fonte
fonte
Isso verifica se o seu comando ainda não existe antes de adicioná-lo.
Felicidades.
fonte
Piping stdout para
crontab
não instalou o novo crontab para mim no macOS, então encontrei esta solução, usando otee
editor em um sub shell:fonte
Se você deseja que a tarefa seja executada como usuário:
Se você deseja que a tarefa seja executada com privilégios:
e verifique a tarefa (com ou sem 'sudo'):
fonte
você também pode adicionar suas tarefas ao /etc/cron.*/
fonte
Você também pode editar o arquivo de texto da tabela cron diretamente, mas sua solução parece perfeitamente aceitável.
fonte