Como criar um trabalho cron usando o Bash automaticamente sem o editor interativo?
395
O crontab tem um argumento para criar trabalhos cron sem usar o editor (crontab -e). Em caso afirmativo, qual seria o código para criar um cronjob a partir de um script Bash?
Infelizmente, a maioria das principais respostas aqui estão apenas mostrando como modificar o crontab - embora de maneiras razoavelmente seguras - mas acho que é a abordagem errada em geral. Melhor, mais seguro e mais simples é soltar um arquivo no {{cron.d}}, e há (atualmente) respostas com baixa votação explicando como fazer isso se você olhar mais para baixo.
gregmac
Respostas:
539
Você pode adicionar ao crontab da seguinte maneira:
#write out current crontab
crontab -l > mycron
#echo new cron into cron file
echo "00 09 * * 1-5 echo hello">> mycron
#install new cron file
crontab mycron
rm mycron
Explicação da linha Cron
*****"command to be executed"-----|||||||||-----Day of week (0-7)(Sunday=0 or 7)|||-------Month(1-12)||---------Day of month (1-31)|-----------Hour(0-23)-------------Minute(0-59)
(crontab -l ; echo "00 09 * * 1-5 echo hello") | crontab -- mais fácil copiar answear de Edo
WBAR
8
Eu sugiro mudar isso ;com &&como um guarda de segurança contra a caso, se crontab -lfalhar. então, como:(crontab -l && echo "0 0 0 0 0 some entry") | crontab -
MacUsers
12
@MacUsers, crontab -lfalha se não houver crontab, portanto, o uso &&torna impossível para o script adicionar a primeira entrada ao crontab.
crontab -llista os trabalhos atuais do crontab, catimprime, echoimprime o novo comando e crontab -adiciona todo o material impresso ao arquivo crontab. Você pode ver o efeito fazendo um novo crontab -l.
obrigado, você poderia explicar a sintaxe ou apontar para um URL que explica isso?
sites
9
crontab -llista os trabalhos atuais do crontab, catimprime, echoimprime o novo comando e crontab -adiciona todo o material impresso ao arquivo crontab. Você pode ver o efeito fazendo um novocrontab -l
nha
3
Funciona um prazer para mim. Se o usuário não tiver um crontab existente, você verá no crontab for <username>, mas funcionará assim mesmo.
Fazy
21
não funciona na minha instância do Amazon EC2. Em vez disso, (crontab -l ; echo "00 09 * * 1-5 echo hello") | crontab -funciona.
Para removê-lo do crontab, qualquer que seja sua programação atual:
( crontab -l | grep -v -F "$croncmd")| crontab -
Notas:
grep -F corresponde literalmente à string, pois não queremos interpretá-la como uma expressão regular
Também ignoramos o agendamento de horário e procuramos apenas o comando. Por aqui; o cronograma pode ser alterado sem o risco de adicionar uma nova linha ao crontab
@ moeseth: Eu obviamente tentei no meu computador (linux). Eu não sugeriria coisas aleatórias que não funcionavam: /
MoonCactus 1/17/17
2
A propósito, 27 pessoas não podem estar erradas (a partir de hoje). Portanto, descreva por que não está funcionando na sua configuração, para que possamos ajudar.
MoonCactus
2
Pode ser um problema OSX.
moeseth
40
Obrigado a todos por sua ajuda. Reunindo o que encontrei aqui e em outros lugares, vim com isso:
Não consegui descobrir como eliminar a necessidade das duas variáveis sem me repetir.
commandé obviamente o comando que eu quero agendar. jobpega $commande adiciona os dados de agendamento. Eu precisava das duas variáveis separadamente na linha de código que faz o trabalho.
Detalhes
Crédito para duckyflip, eu uso esse pequeno redirecionamento ( <(*command*)) para transformar a saída de crontab -lem input para o fgrepcomando.
fgrepfiltra todas as correspondências de $command( -vopção), sem distinção entre maiúsculas e minúsculas ( -iopção).
Novamente, o pequeno redirecionamento ( <(*command*)) é usado para transformar o resultado novamente em entrada para o catcomando.
O catcomando também recebe echo "$job"(auto-explicativo), novamente, através do uso do redirecionamento (<(*command*) ).
Portanto, a saída filtrada crontab -le a simples echo "$job", combinadas, são canalizadas ('|') crontab -para finalmente serem gravadas.
E todos eles viveram felizes para sempre!
Em poucas palavras:
Essa linha de código filtra todos os trabalhos cron que correspondem ao comando e, em seguida, grava os trabalhos cron restantes com o novo, atuando efetivamente como uma função "adicionar" ou "atualizar". Para utilizar este, tudo que você tem a fazer é trocar o valores para o commande jobvariáveis.
Para o benefício de outras pessoas que leem, a vantagem dessa abordagem é que você pode executá-la várias vezes sem se preocupar com entradas duplicadas no crontab (ao contrário de todas as outras soluções). Isso é por causa dofgrep -v
aleemb
5
Se você preferir a maneira tradicional da esquerda para a direita de canalizar as coisas, substitua a última linha por: crontab -l | fgrep -i -v "$command" | { cat; echo "$job"; } | crontab -l
Antoine Lizée
11
@ AntoineLizée, você responde que tem um "l" extra no final, que não deveria estar lá.
Neste exemplo acima, criamos um arquivo /etc/cron.d/, fornecemos as variáveis de ambiente para que o comando seja executado com êxito e fornecemos usero comando e o commandpróprio. Este arquivo não deve ser executável e o nome deve conter apenas alfanumérico e hífens (mais detalhes abaixo).
Para dar uma resposta completa, porém, vejamos as diferenças entre crontabvs cron/crond:
crontab -- maintain tables for driving cron for individual users
Para aqueles que desejam executar o trabalho no contexto de seu usuário no sistema, o uso crontabpode fazer todo o sentido.
cron -- daemon to execute scheduled commands
Para aqueles que usam o gerenciamento de configuração ou desejam gerenciar trabalhos para outros usuários, nesse caso, devemos usar cron .
Um rápido trecho das páginas de manual fornece alguns exemplos do que fazer e não fazer:
O arquivo / etc / crontab e os arquivos em /etc/cron.d devem pertencer ao root e não devem ser graváveis em grupo ou outros. Ao contrário da área de spool, os arquivos em /etc/cron.d ou em /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly e /etc/cron.monthly também podem ser links simbólicos, desde que o link simbólico e o arquivo para o qual ele aponta sejam de propriedade da raiz. Os arquivos em /etc/cron.d não precisam ser executáveis, enquanto os arquivos em /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly e /etc/cron.monthly, como eles são executados por peças executadas (consulte peças executadas (8) para obter mais informações).
Ainda estou sh: 1: Syntax error: "(" unexpectedusando sh .
Batandwa
Isso só funciona se você estiver usando o BASH. Não estou ciente da sintaxe correta do DASH (sh). Também
atualizou
11
fwiw, eu recebo esse erro usando o bash se houver um espaço entre o <e (. Isso significa < (falha, mas <(trabalhos, a menos que haja asteriscos na sua agenda ...
doublesharp
Eu acredito que esta é a maneira correta:cat <(crontab -l |grep -v "${CRON}") <(echo "${CRON}") | crontab -
Stanislav
5
Para uma criação / substituição rápida e suja agradável de um crontab de um script BASH, usei esta notação:
Se você estiver usando o Vixie Cron, por exemplo, na maioria das distribuições Linux, basta colocar um arquivo em /etc/cron.d com o cronjob individual.
Isso funciona apenas para a raiz, é claro. Se o seu sistema suportar isso, você deverá ver vários exemplos. (Observe o nome de usuário incluído na linha, na mesma sintaxe do antigo / etc / crontab)
É uma triste característica no cron que não há como lidar com isso como um usuário comum e que tantas implementações do cron não têm como lidar com isso.
sudo - porque você precisa de privilégios elevados para alterar as configurações do cron no diretório / etc
eco - um veículo para criar saída em saída padrão. printf, cat ... funcionaria bem
"- use aspas duplas no início da sua string, você é um profissional
0,15,30,45 * * * * - o cronograma padrão de execução do cron, que é executado a cada 15 minutos
ntpdate -u time.nist.gov - o comando real que quero executar
"- porque minhas primeiras aspas duplas precisam de um amigo para fechar a linha que está sendo impressa
>> - o redirecionamento duplo é anexado em vez de substituído *
/etc/cron.d/vmclocksync - vmclocksync é o nome do arquivo que eu escolhi, ele entra em /etc/cron.d/
* se usássemos o redirecionamento>, poderíamos garantir que tivéssemos apenas uma entrada de tarefa. Porém, estaríamos correndo o risco de descartar outras regras em um arquivo existente. Você pode decidir por si próprio se uma possível destruição com> está correta ou possíveis duplicatas com >> são para você. Como alternativa, você pode fazer algo complicado ou envolvido para verificar se o nome do arquivo existe, se existe algo nele e se você está adicionando algum tipo de duplicata - mas, tenho algo a fazer e não posso fazer isso por você agora.
Script bash para adicionar tarefa cron sem o editor interativo. O código abaixo ajuda a adicionar um cronjob usando arquivos linux.
#!/bin/bash
cron_path=/var/spool/cron/crontabs/root
#cron job to run every 10 min.
echo "*/10 * * * * command to be executed">> $cron_path
#cron job to run every 1 hour.
echo "0 */1 * * * command to be executed">> $cron_path
Sei que já faz muito tempo, mas essa ainda é a única resposta boa, já que todos os mais votados removem os velhos crons em vez de apenas acrescentar o novo.
28/08/19
11
Este não instala um cron. Apenas o anexa a um arquivo. Você precisará, de alguma forma, notificar o processo cron para instalar a nova entrada.
Apoorv Parijat
1
Aqui está uma função bash para adicionar um comando crontabsem duplicação
function addtocrontab (){local frequency=$1
local command=$2
local job="$frequency $command"
cat <(fgrep -i -v "$command"<(crontab -l))<(echo "$job")| crontab -}
addtocrontab "0 0 1 * *""echo hello"
Isso garantirá que você esteja manipulando a nova linha em branco na parte inferior corretamente. Para evitar problemas com o crontab, geralmente você deve finalizar o arquivo crontab com uma nova linha em branco. E o script acima garante que primeiro remova todas as linhas em branco com o "grep". parte e, em seguida, adicione uma nova linha em branco no final com o "\ n" no final do script. Isso também impedirá a obtenção de uma linha em branco acima do seu novo comando se o arquivo crontab existente terminar com uma linha em branco.
Respostas:
Você pode adicionar ao crontab da seguinte maneira:
Explicação da linha Cron
Fonte nixCraft .
fonte
(crontab -l ; echo "00 09 * * 1-5 echo hello") | crontab -
- mais fácil copiar answear de Edo;
com&&
como um guarda de segurança contra a caso, secrontab -l
falhar. então, como:(crontab -l && echo "0 0 0 0 0 some entry") | crontab -
crontab -l
falha se não houver crontab, portanto, o uso&&
torna impossível para o script adicionar a primeira entrada ao crontab.Você pode fazer isso on-the-fly
crontab -l
lista os trabalhos atuais do crontab,cat
imprime,echo
imprime o novo comando ecrontab -
adiciona todo o material impresso ao arquivo crontab. Você pode ver o efeito fazendo um novocrontab -l
.fonte
crontab -l
lista os trabalhos atuais do crontab,cat
imprime,echo
imprime o novo comando ecrontab -
adiciona todo o material impresso ao arquivo crontab. Você pode ver o efeito fazendo um novocrontab -l
no crontab for <username>
, mas funcionará assim mesmo.(crontab -l ; echo "00 09 * * 1-5 echo hello") | crontab -
funciona.Este menor não requer arquivo temporário, é imune a várias inserções e permite alterar a programação de uma entrada existente.
Digamos que você tenha estes:
Para adicioná-lo ao crontab, sem duplicação:
Para removê-lo do crontab, qualquer que seja sua programação atual:
Notas:
fonte
Obrigado a todos por sua ajuda. Reunindo o que encontrei aqui e em outros lugares, vim com isso:
O código
Não consegui descobrir como eliminar a necessidade das duas variáveis sem me repetir.
command
é obviamente o comando que eu quero agendar.job
pega$command
e adiciona os dados de agendamento. Eu precisava das duas variáveis separadamente na linha de código que faz o trabalho.Detalhes
<(*command*)
) para transformar a saída decrontab -l
em input para ofgrep
comando.fgrep
filtra todas as correspondências de$command
(-v
opção), sem distinção entre maiúsculas e minúsculas (-i
opção).<(*command*)
) é usado para transformar o resultado novamente em entrada para ocat
comando.cat
comando também recebeecho "$job"
(auto-explicativo), novamente, através do uso do redirecionamento (<(*command*)
).crontab -l
e a simplesecho "$job"
, combinadas, são canalizadas ('|')crontab -
para finalmente serem gravadas.Em poucas palavras:
Essa linha de código filtra todos os trabalhos cron que correspondem ao comando e, em seguida, grava os trabalhos cron restantes com o novo, atuando efetivamente como uma função "adicionar" ou "atualizar". Para utilizar este, tudo que você tem a fazer é trocar o valores para o
command
ejob
variáveis.fonte
fgrep -v
crontab -l | fgrep -i -v "$command" | { cat; echo "$job"; } | crontab -l
EDIT (substituição fixa):
fonte
crontab -l
falhar, mascrontab -
for bem-sucedido, seu crontab será de uma linha.Houve muitas boas respostas sobre o uso do crontab, mas nenhuma menção a um método mais simples, como o uso
cron
.A utilização
cron
aproveitaria os arquivos e diretórios do sistema localizados em/etc/crontab
,/etc/cron.daily,weekly,hourly
ou/etc/cron.d/
:Neste exemplo acima, criamos um arquivo
/etc/cron.d/
, fornecemos as variáveis de ambiente para que o comando seja executado com êxito e fornecemosuser
o comando e ocommand
próprio. Este arquivo não deve ser executável e o nome deve conter apenas alfanumérico e hífens (mais detalhes abaixo).Para dar uma resposta completa, porém, vejamos as diferenças entre
crontab
vscron/crond
:Para aqueles que desejam executar o trabalho no contexto de seu usuário no sistema, o uso
crontab
pode fazer todo o sentido.Para aqueles que usam o gerenciamento de configuração ou desejam gerenciar trabalhos para outros usuários, nesse caso, devemos usar
cron
.Um rápido trecho das páginas de manual fornece alguns exemplos do que fazer e não fazer:
Gerenciar crons dessa maneira é mais fácil e escalável da perspectiva do sistema, mas nem sempre será a melhor solução.
fonte
<job>
não deve incluir uma extensão de arquivo.Provavelmente, você está automatizando isso e não deseja que um único trabalho seja adicionado duas vezes. Nesse caso, use:
Isso só funciona se você estiver usando o BASH. Não estou ciente da
sh
sintaxe correta DASH ( ).Atualização: isso não funciona se o usuário ainda não tiver um crontab. Uma maneira mais confiável seria:
Como alternativa, se sua distribuição suportar, você também pode usar um arquivo separado:
Encontrei aqueles em outra questão SO .
fonte
sh: 1: Syntax error: "(" unexpected
usando sh .<
e(
. Isso significa< (
falha, mas<(
trabalhos, a menos que haja asteriscos na sua agenda ...cat <(crontab -l |grep -v "${CRON}") <(echo "${CRON}") | crontab -
Para uma criação / substituição rápida e suja agradável de um crontab de um script BASH, usei esta notação:
fonte
Uma variante que apenas edita o crontab se a string desejada não for encontrada lá:
fonte
Se você estiver usando o Vixie Cron, por exemplo, na maioria das distribuições Linux, basta colocar um arquivo em /etc/cron.d com o cronjob individual.
Isso funciona apenas para a raiz, é claro. Se o seu sistema suportar isso, você deverá ver vários exemplos. (Observe o nome de usuário incluído na linha, na mesma sintaxe do antigo / etc / crontab)
É uma triste característica no cron que não há como lidar com isso como um usuário comum e que tantas implementações do cron não têm como lidar com isso.
fonte
Então, no Debian, Ubuntu e em muitas distros similares baseadas no Debian ...
Existe um mecanismo de concatenação de tarefas cron que pega um arquivo de configuração, os agrupa e os adiciona ao seu serviço cron em execução.
Você pode colocar um arquivo em /etc/cron.d/somefilename, em que somefilename é o que você deseja.
Vamos desmontar isso:
sudo - porque você precisa de privilégios elevados para alterar as configurações do cron no diretório / etc
eco - um veículo para criar saída em saída padrão. printf, cat ... funcionaria bem
"- use aspas duplas no início da sua string, você é um profissional
0,15,30,45 * * * * - o cronograma padrão de execução do cron, que é executado a cada 15 minutos
ntpdate -u time.nist.gov - o comando real que quero executar
"- porque minhas primeiras aspas duplas precisam de um amigo para fechar a linha que está sendo impressa
>> - o redirecionamento duplo é anexado em vez de substituído *
/etc/cron.d/vmclocksync - vmclocksync é o nome do arquivo que eu escolhi, ele entra em /etc/cron.d/
* se usássemos o redirecionamento>, poderíamos garantir que tivéssemos apenas uma entrada de tarefa. Porém, estaríamos correndo o risco de descartar outras regras em um arquivo existente. Você pode decidir por si próprio se uma possível destruição com> está correta ou possíveis duplicatas com >> são para você. Como alternativa, você pode fazer algo complicado ou envolvido para verificar se o nome do arquivo existe, se existe algo nele e se você está adicionando algum tipo de duplicata - mas, tenho algo a fazer e não posso fazer isso por você agora.
fonte
Script bash para adicionar tarefa cron sem o editor interativo. O código abaixo ajuda a adicionar um cronjob usando arquivos linux.
fonte
Aqui está uma função bash para adicionar um comando
crontab
sem duplicaçãofonte
adicione o parâmetro -w ao comando grep exato, sem que o parâmetro -w inclua o cronjob "testing" causa a exclusão do trabalho cron "testing123"
função de script para adicionar / remover cronjobs. sem entradas de duplicação:
testado:
fonte
Minha solução preferida para isso seria esta:
Isso garantirá que você esteja manipulando a nova linha em branco na parte inferior corretamente. Para evitar problemas com o crontab, geralmente você deve finalizar o arquivo crontab com uma nova linha em branco. E o script acima garante que primeiro remova todas as linhas em branco com o "grep". parte e, em seguida, adicione uma nova linha em branco no final com o "\ n" no final do script. Isso também impedirá a obtenção de uma linha em branco acima do seu novo comando se o arquivo crontab existente terminar com uma linha em branco.
fonte
fonte
Não, não há opção no crontab para modificar os arquivos cron.
Você precisa: pegar o arquivo cron atual (crontab -l> newfile), alterá-lo e colocar o novo arquivo no lugar (crontab newfile).
Se você está familiarizado com o perl, pode usar este módulo Config :: Crontab .
Andrea LLP
fonte
função de script para adicionar cronjobs. verifique entradas duplicadas, expressões utilizáveis *> "
testado:
fonte: meu cérebro;)
fonte
Provavelmente, você pode alterar o editor padrão para ed e usar um heredoc para editar.
Observe que o início > nesse código significa que a tecla Enter / Retorno é pressionada para criar uma nova linha.
O a significa APPEND, para que não substitua nada.
A . significa que você terminou de editar.
O w significa WRITE as alterações.
Os q meios SAIR ou saída ed.
você pode conferir
Você também pode excluir uma entrada.
Isso excluirá a entrada crontab com Myscript.
O d significa excluir o padrão dentro de / / .
Não verifique novamente
Esta solução funciona dentro de um script muito menos o > é claro :-)
fonte