Execute o Cronjob todas as noites entre as 3 e as 6 horas, mas apenas uma vez

0

Eu quero executar um cronjob diariamente em um intervalo de tempo específico, mas apenas uma vez nesse período. Como isso é possível?

Eu vejo uma possibilidade em anacrhon mas não sei como configurar tal cenário.

    
por LeMike 19.08.2013 / 19:21

3 respostas

2

Você pode fazer seu cronjob em /etc/cron.daily/ e ele será executado automaticamente nesse período de tempo.

Editar:

Desculpe, eu estava fazendo referência a uma antiga instalação Debian em que anacron não foi instalado por padrão. Nesse caso /etc/cron.daily/ foi executado por /etc/crontab em 6:25. Mas as instalações mais recentes do Debian (e também o Ubuntu) instalam anacron por padrão e assim /etc/cron.daily/ será executado por /etc/anacrontab cinco minutos depois que anacron foi iniciado ou a cada novo dia.

Para alcançar seu cronograma (a partir dos comentários), você pode configurar um cronjob que, por exemplo, a cada 10 min entre 3-6 inicie anacron , que cuidará de que a tarefa de backup seja executada apenas uma vez ou que você possa escrever um script de controle personalizado.

1. Alternativa: anacron

mkdir ~/.local/share/anacron_spool
echo "1 0 backup.daily /path/to/backup.sh" > ~/.config/anacrontab
(crontab -l; echo "*/10 3-6 * * * /usr/sbin/anacron -s -t $HOME/.config/anacrontab -S $HOME/.local/share/anacron_spool") | crontab -

Isso fará com que o anacron para serializar ( -s ) execute todos os trabalhos definidos em ~/.config/anacrontab . Como, por padrão, somente a raiz tem permissão de gravação para gravar em /var/spool/anacron/ , onde os registros de data e hora são armazenados, usamos um diretório-spool personalizado ( -S ). Se todos os trabalhos forem feitos para hoje, o anacron sairá.

2. Alternativa: script de controle personalizado

Abra um editor (por exemplo, sudo nano /usr/local/bin/run_once_a_day.sh ) e cole isto:

#!/bin/bash
SPOOL="$HOME/.local/share/run_once_spool/"
if [ $# != 2 ]; then
    echo "Usage: $(basename $0) <job-identifier> <command>"
    exit 1
fi

if [ ! -d $SPOOL ]; then
    mkdir $SPOOL
fi

if [ -e ${SPOOL}${1} ]; then
    last_run=$(cat ${SPOOL}${1})
else
    last_run=0
fi

today=$(date +%Y%m%d)
if [ $last_run != $today ]; then
    $2
    echo $today > ${SPOOL}${1}
fi

Pressione CTRL + O para salvar e CTRL + X para sair. Tornar executável e adicionar um cronjob que irá iniciá-lo periodicamente com:

sudo chmod 755 !$
(crontab -l; echo "*/10 3-6 * * * /usr/local/bin/run_once_a_day.sh backup.daily /path/to/backup.sh") | crontab -
    
por Germar 19.08.2013 / 19:30
0

Um cron job será executado sempre somente uma vez em um determinado agendamento / horário. Portanto, se você definir um cron job no qual deseja entre 3 e 6, isso será executado apenas uma vez em um horário especificado. Apenas uma vez e nunca mais de uma vez!

Veja mais explicações e alguns exemplos em: link

    
por Radu Rădeanu 19.08.2013 / 19:35
0

Acho que a solução mais simples é ter um script wrapper sendo chamado a cada N minutos durante o intervalo, mas ele começa checando a existência de um arquivo "bloqueador" que ele cria na execução.

#!/bin/bash
[[ -f /dev/shm/cron-once-script-lock ]] && exit 0
touch /dev/shm/cron-once-script-lock

actualcronjob.sh # or whatever non-script command it may be

# end of wrapper script

E a linha do cron seria como:

*/10 3-6 * * * /wherever/the/script/is/wrapper-script.sh

Ou talvez

*/10 3-6 * * * bash /wherever/the/script/is/wrapper-script.sh

A única ressalva é que o cron é executado sob um "ambiente" restrito e você pode precisar exportar variáveis de ambiente e esse tipo de coisa, mas esse é outro assunto completamente diferente.

    
por ubuntuser 24.03.2016 / 04:32