one - Como criar uma tarefa cron usando Bash automaticamente sem o editor interativo?



shell (12)

O crontab tem um argumento para criar tarefas agendadas sem usar o editor (crontab -e). Em caso afirmativo, qual seria o código criar um cronjob de um script Bash?

https://ffff65535.com


É provável que você esteja automatizando isso e não deseja que um único trabalho seja adicionado duas vezes. Nesse caso, use:

__cron="1 2 3 4 5 /root/bin/backup.sh"
cat <(crontab -l) |grep -v "${__cron}" <(echo "${__cron}")

Isso só funciona se você estiver usando BASH. Não estou ciente da sintaxe correta do DASH ( sh ).

Atualização: Isso não funciona se o usuário ainda não tiver um crontab. Uma maneira mais confiável seria:

(crontab -l ; echo "1 2 3 4 5 /root/bin/backup.sh") | sort - | uniq - | crontab - 

Como alternativa, se sua distro oferecer suporte, você também pode usar um arquivo separado:

echo "1 2 3 4 5 /root/bin/backup.sh" |sudo tee /etc/crond.d/backup

Encontrei aqueles em outra pergunta SO .


Aqui está uma função bash para adicionar um comando para crontab sem 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"

EDITAR (sobrescrição fixa):

cat <(crontab -l) <(echo "1 2 3 4 5 scripty.sh") | crontab -

Então, no Debian, no Ubuntu e em muitas distribuições baseadas no Debian ...

Existe um mecanismo de concatenação de tarefa Cron que pega um arquivo de configuração, agrupa-os e os adiciona ao seu serviço cron em execução.

Você pode colocar um arquivo no /etc/cron.d/somefilename onde somefilename é o que você quiser.

sudo echo "0,15,30,45 * * * * ntpdate -u time.nist.gov" >> /etc/cron.d/vmclocksync

Vamos desmontar isso:

sudo - porque você precisa de privilégios elevados para alterar as configurações do cron no diretório / etc

echo - um veículo para criar saída em std out. printf, cat ... também funcionaria

"- use uma cotação dupla no começo da sua sequência, você é um profissional

0,15,30,45 * * * * - o cronograma padrão de execução cron, este é 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 produzida

>> - o redirecionamento duplo acrescenta em vez de substituir *

/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 tínhamos apenas uma entrada de tarefa. Mas, estaríamos em risco de eliminar quaisquer outras regras em um arquivo existente. Você pode decidir por si mesmo se possível destruição com> está certo ou possíveis duplicatas com >> são para você. Alternativamente, você poderia fazer algo complicado ou envolvido para verificar se o nome do arquivo existe, se há algo nele, e se você está adicionando algum tipo de duplicata - mas, eu tenho coisas para fazer e não posso fazer isso para você agora mesmo.


Minha solução preferida para isso seria:

(crontab -l | grep . ; echo -e "0 4 * * * myscript\n") | crontab -

Isso fará com que você esteja lidando corretamente com a nova linha em branco na parte inferior. Para evitar problemas com o crontab, você deve normalmente terminar o arquivo crontab com uma nova linha em branco. E o script acima garante que primeiro remove quaisquer 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 novo comando se o arquivo crontab existente terminar com uma linha em branco.


Não, não há opção no crontab para modificar os arquivos cron.

Você tem que: pegar o arquivo cron atual (crontab -l> newfile), alterá-lo e colocar o novo arquivo no lugar (crontab newfile).

Se você estiver familiarizado com o perl, você pode usar este módulo Config::Crontab .

LLP, Andrea


Para uma criação e substituição rápida e suja de um crontab de um script BASH, usei esta notação:

crontab <<EOF
00 09 * * 1-5 echo hello
EOF

Se você estiver usando o Vixie Cron, por exemplo, na maioria das distribuições Linux, você pode simplesmente colocar um arquivo em /etc/cron.d com o cronjob individual.

Isso só funciona para a raiz, é claro. Se o seu sistema suportar isso, você deverá ver vários exemplos lá. (Observe o nome de usuário incluído na linha, na mesma sintaxe que o antigo / etc / crontab)

É uma triste falha no cron que não há como lidar com isso como um usuário regular, e que muitas implementações cron não têm jeito de lidar com isso.


Uma variante que só edita crontab se a string desejada não for encontrada lá:

CMD="/sbin/modprobe fcpci"
JOB="@reboot $CMD"
TMPC="mycron"
grep "$CMD" -q <(crontab -l) || (crontab -l>"$TMPC"; echo "$JOB">>"$TMPC"; crontab "$TMPC")

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)

Fonte nixCraft .


Você provavelmente pode alterar o editor padrão para ed e usar um heredoc para editar.

EDITOR=ed
export EDITOR

crontab -e << EOF
> a
> * * * * * Myscript
> * * * * * AnotherScript
> * * * * * MoreScript
> .
> w
> q
> EOF

Observe que o principal > nesse código significa que a tecla return / enter é pressionada para criar uma nova linha.

A significa APÊNDICE para que não substitua nada.

O. significa que você acabou de editar.

O w significa ESCREVA as mudanças.

Q significa QUIT ou sai ed.

você pode conferir

crontab -l

Você pode excluir uma entrada também.

EDITOR=ed
export EDITOR

crontab -e << EOF
> /Myscript/
> d
> .
> w
> q
> EOF

Isso excluirá a entrada do crontab com o Myscript.

O d significa excluir o padrão dentro do / / .

Não verifique novamente

crontab -l

Esta solução funciona dentro de um script muito menos > claro :-)


função de script para adicionar cronjobs. verifique entradas duplicadas, expressões utilizáveis ​​*> "

cronjob_creator () {         
# usage: cronjob_creator '<interval>' '<command>'

  if [[ -z $1 ]] ;then
    printf " no interval specified\n"
elif [[ -z $2 ]] ;then
    printf " no command specified\n"
else
    CRONIN="/tmp/cti_tmp"
    crontab -l | grep -vw "$1 $2" > "$CRONIN"
    echo "$1 $2" >> $CRONIN
    crontab "$CRONIN"
    rm $CRONIN
fi
}

testado:

$ ./cronjob_creator.sh '*/10 * * * *' 'echo "this is a test" > export_file'
$ crontab  -l
$ */10 * * * * echo "this is a test" > export_file

fonte: meu cérebro;)





cron