Como agendar / cancelar a tarefa do cron a partir do shell

0

Eu tenho um servidor Ubuntu onde coloco o núcleo do meu aplicativo. É um jar que precisa estar sempre ouvindo pedidos. Eu fiz um script para executá-lo com os parâmetros corretos.

O cenário é semelhante a este: local do script: /home/andrea/core/script.sh

script.sh usa um parâmetro, "start" ou "stop" dependendo do que eu preciso fazer.

Como eu preciso que ele esteja ativo, criei um cron job que verifica se está ativo e, caso contrário, o inicia novamente com os seguintes comandos:

crontab -e
*/5 * * * * /home/andrea/core/testscriptalive.sh

em que testscriptalive.sh é:     #! / bin / bash

# Check if core is running
if [ ! -f /tmp/core.pid ]; then 
  cd /home/andrea/core/
  ./script.sh start
  ./email.sh
fi

Então, a cada 5 minutos o cron roda o script "testscriptalive.sh", que basicamente verifica se existe o PID correto e se ele não iniciar novamente o núcleo e me envia um e-mail. Até agora tudo bem. O que eu preciso fazer é: se eu quiser parar o núcleo por razões X, como posso impedir que o cron job seja executado sem editá-lo manualmente? Por exemplo, se no console eu inserir "./script stop" após 5 minutos, o cron job reinicia automaticamente mesmo que eu não queira. Eu preciso de dois scripts sh para acoplar meus parâmetros "start" e "stop" que:

começar:

checks if the job is correctly stored in cron, if not adds it

pare:

removes the job from cron

Como posso conseguir isso?

Obrigado

    
por Andrea 13.08.2013 / 18:47

3 respostas

0

Uma ideia é criar alguns arquivos de texto que contenham seus trabalhos agendados. Um com a lista normal de trabalhos agendados, depois outro com a lista normal mais este trabalho. Então, você pode carregar o crontab a partir dos arquivos de texto.

crontab /path/to/MyCronJobs.txt

Isso substituirá o crontab pelos trabalhos no arquivo de texto.

    
por 13.08.2013 / 19:33
1

Você precisa adicionar o check-in no procedimento de parada de script.sh : Se script.sh for executado a partir do shell (não do cron) - > crie algum arquivo /tmp/stop.tmp e exclua este arquivo no procedimento inicial.

Portanto, testscriptalive.sh também precisa verificar se /tmp/stop.tmp existe ...

    
por 13.08.2013 / 19:33
0

A melhor solução que eu encontrei para necessidades como essa é adicionar bloqueio a todos os meus scripts com e. g .:

if [[ -f "/tmp/$0.lock" ]]; then
  echo "$0 is locked.  Bailing."
  exit 0
else
  touch "/tmp/$0.lock"
fi
# the rest of the script goes here
rm -f "/tmp/$0.lock"

Quando estiver nos meus scripts, posso manualmente touch /tmp/scriptname.lock colocar o arquivo de bloqueio quando eu quiser manter a execução da tarefa cron - o cron ainda disparará o script, mas o script verá o arquivo de bloqueio e abortará .

    
por 16.08.2013 / 02:13