Preciso adicionar um trabalho cron através de um script que corro para configurar um servidor. Atualmente, estou usando o Ubuntu. Eu posso usar, crontab -e
mas isso abrirá um editor para editar o crontab atual. Eu quero fazer isso programaticamente.
É possível fazer isso?
Respostas:
Os trabalhos Cron geralmente são armazenados em um arquivo por usuário em
/var/spool/cron
A coisa mais simples a fazer é provavelmente apenas criar um arquivo de texto com o trabalho configurado, copiá-lo para a pasta cron spool e verificar se ele possui as permissões corretas (600).
fonte
Aqui está uma lista que não usa / requer que o novo trabalho esteja em um arquivo:
O
2>/dev/null
é importante para que você não receba ano crontab for username
mensagem que alguns * nixes produzem se atualmente não houver entradas crontab.fonte
echo -e "$(sudo crontab -u root -l)\n* * * * * echo hello > /home/danny/temp.log 2>&1" | sudo crontab -u root -
Espero que isso ajude alguémPara crontabs de usuário (incluindo root), você pode fazer algo como:
onde o arquivo chamado "nome do arquivo" contém itens a serem anexados. Você também pode manipular o texto usando
sed
ou outra ferramenta no lugar decat
. Você deve usar ocrontab
comando em vez de modificar diretamente o arquivo.Uma operação semelhante seria:
Se você estiver modificando ou criando crontabs do sistema, eles podem ser manipulados como faria com arquivos de texto comuns. Eles são armazenados nos
/etc/cron.d
,/etc/cron.hourly
,/etc/cron.daily
,/etc/cron.weekly
,/etc/cron.monthly
diretórios e nos arquivos/etc/crontab
e/etc/anacrontab
.fonte
echo
), recebi "crontab: erro de uso: o nome do arquivo deve ser especificado para substituição". A página do manual Cron mostra a sintaxe comocrontab [ -u user ] file
, ou seja, com um nome de arquivo obrigatório. Existe algum truque para aceitar os dados canalizados?stdin
. Eu vou corrigir minha resposta.No Ubuntu e em muitas outras distribuições, você pode simplesmente colocar um arquivo no
/etc/cron.d
diretório que contém uma única linha com uma entrada válida do crontab . Não há necessidade de adicionar uma linha a um arquivo existente.Se você só precisa de algo para executar diariamente, basta colocar um arquivo no
/etc/cron.daily
. Da mesma forma, você também pode soltar arquivos para/etc/cron.hourly
,/etc/cron.monthly
, e/etc/cron.weekly
.fonte
Uma resposta ainda mais simples para sua pergunta seria:
Você pode configurar cronjobs em servidores remotos como abaixo:
No Linux, o local padrão do
crontab
arquivo é/var/spool/cron/
. Aqui você pode encontrar oscrontab
arquivos de todos os usuários. Você só precisa anexar sua entrada do cronjob ao arquivo do respectivo usuário. No exemplo acima, o arquivo crontab do usuário raiz está sendo anexado com um cronjob para ser executado/root/test.sh
todos os dias às 01:00.fonte
/var/spool/cron/crontabs/root
no Ubuntu.Os arquivos Crontab são simplesmente arquivos de texto e, como tal, podem ser tratados como qualquer outro arquivo de texto. O objetivo do
crontab
comando é tornar a edição dos arquivos crontab mais segura. Quando editado por esse comando, o arquivo é verificado quanto a erros e salvo apenas se não houver nenhum.crontab [path to file]
pode ser usado para especificar um crontab armazenado em um arquivo. Assimcrontab -e
, isso só instalará o arquivo se estiver livre de erros.Portanto, um script pode gravar diretamente os arquivos da guia cron ou gravá-los em um arquivo temporário e carregá-los com o
crontab [path to temp file]
comando Escrever diretamente evita a necessidade de gravar um arquivo temporário, mas também evita a verificação de segurança.fonte
crontab [path to file]
.. Essa foi definitivamente a melhor opção para mim, pois permite um código mais legível. Uso o crontab para rastrear encomendas e alterar meu papel de parede da área de trabalho com o status. Quando não estou esperando encomendas, não é preciso verificar a cada hora. É por isso que eu queria que o script editasse automaticamente a frequência cron.(Não tenho reputação suficiente para comentar, por isso estou adicionando como resposta: fique à vontade para adicioná-lo como comentário ao lado da resposta dele)
A linha única de Joe Casadonte é perfeita, exceto se você executar com
set -e
, ou seja, se o seu script estiver configurado para falhar por erro e se ainda não houver cronjobs. Nesse caso, o one-liner NÃO criará o cronjob, mas NÃO interromperá o script. A falha silenciosa pode ser muito enganadora.O motivo é que
crontab -l
retorna com um1
código de retorno, fazendo com que o comando subseqüente (theecho
) não seja executado ... portanto, o cronjob não é criado. Mas, como são executados como um subprocesso (por causa dos parênteses), eles não param o script.(Curiosamente, se você executar o mesmo comando novamente, ele vai trabalhar: depois de ter executado
crontab -
uma vez,crontab -l
ainda saídas nada, mas ele não retorna mais um erro (você não obter ano crontab for <user>
mensagem mais) para que o posterior.echo
É executado e o crontab é criado)De qualquer forma, se você executar com
set -e
, a linha deverá ser:fonte
Como uma correção para aqueles que sugerem
crontab -l | crontab -
: Isso não funciona em todos os sistemas. Por exemplo, tive que adicionar um trabalho ao crontab raiz em dezenas de servidores executando uma versão antiga do SUSE (não pergunte o porquê). Os SUSEs antigos acrescentam linhas de comentário à saída decrontab -l
, tornandocrontab -l | crontab -
-os não-idempotentes (o Debian reconhece esse problema na página de manual do crontab e corrigiu sua versão do Vixie Cron para alterar o comportamento padrão decrontab -l
).Para editar programaticamente os crontabs em sistemas onde
crontab -l
adiciona comentários, você pode tentar o seguinte:EDITOR=cat crontab -e > old_crontab; cat old_crontab new_job | crontab -
EDITOR=cat
diz ao crontab para usarcat
como editor (não o vi padrão usual), que não altera o arquivo, mas o copia para o stdout. Isso ainda pode falhar secrontab -
espera entrada em um formato diferente do quecrontab -e
sai. Não tente substituir a finalcrontab -
porcrontab -e
- ela não funcionará.fonte
Bem,
/etc/crontab
apenas um arquivo ascii, então o mais simples é apenasque adicionará um trabalho que enviará um e-mail a cada 15 minutos. Ajuste de acordo com o gosto e teste por
grep
meios ou outros meios se a linha já foi adicionada para tornar seu script idempotente.No Ubuntu et al, você também pode soltar arquivos nos
/etc/cron.*
quais é mais fácil fazer e testar --- além de não mexer com arquivos de configuração (sistema) como/etc/crontab
.fonte
crond
que monitora, e certamente na plataforma declarada do OP.Aqui está como modificar uma entrada do cron sem editar diretamente o arquivo cron (que é desaprovado).
Se você deseja remover uma entrada cron, use este:
Sei que não é isso que gaurav estava pedindo, mas por que não ter todas as soluções em um só lugar?
fonte
Eu escrevi uma ferramenta de implantação do crontab em python: https://github.com/monklof/deploycron
Instalar o seu crontab é muito fácil, isso irá mesclar o crontab no crontab existente do sistema.
fonte
É uma abordagem para adicionar incrementalmente o trabalho cron:
fonte