Como posso usar o Cron para executar scripts de shells em um horário fixo?

2

Estou querendo aprender o cron e procurei alguns tutoriais de qualidade. Eu encontrei Como faço para configurar um cron job .

Meu objetivo é ter uma pasta em uma rede que tenha subpastas. Cada subpasta é um script específico que será executado pelo cron. Eu não quero sobrecarregar o nosso sistema assim como posso criar o cron a executar um script de shell após o tempo atribuído e script anterior é executado?

Exemplo:

Main Folder
    Sub1 - script1
    Sub2 - script2
    Sub3 - script3

Cron 10:01 - runs script1
Cron 10:02 - runs script2
Cron 10:03 - runs script3
Cron 10:04 - runs script1
Cron 10:05 - runs script2
    
por DᴀʀᴛʜVᴀᴅᴇʀ 05.03.2013 / 17:42

3 respostas

2

Esboço da ideia

Seu amigo é um antigo cron companion at .

  Comandos

at e batch, a partir da entrada padrão ou de um arquivo especificado, que devem ser executados posteriormente, usando / bin / sh

Combine isso com run-parts .

  

run-parts - executa scripts ou programas em um diretório

A idéia é que você escreva um cron job que inicie os scripts nas "sub-pastas" com o uso de run-parts .

Se você quiser paralelizar a execução, dependendo do carregamento do sistema, você pode quebrar a execução de cada script com batch .

Exemplo

Nas minhas instalações, eu uso meu próprio script de wrapper batchme . Isso fornece alguns aprimoramentos para enviar relatórios e saída.

Os scripts cron. {daily, weekly, monthly} são envoltos no meu crontab dessa maneira:

@midnight   root  test -x /usr/sbin/anacron ||  for script in $( run-parts --list  /etc/cron.daily)  ; do batchme --quiet --info "cron-daily ${script}" ${script} ; done

@weekly   root  test -x /usr/sbin/anacron ||  for script in $( run-parts --list  /etc/cron.weekly) ; do batchme --quiet --info "cron-weekly ${script}" ${script} ; done

@monthly        root  test -x /usr/sbin/anacron ||  for script in $( run-parts --list  /etc/cron.monthly); do batchme --quiet --info "cron-monthly ${script}" ${script} ; done
    
por H.-Dirk Schmitt 05.03.2013 / 17:46
0

Escreva ainda um quarto script que chame os 3 primeiros scritps em ordem.

 #! /bin/sh
/path/to/script1
/path/to/script2
/path/to/script3

Em seguida, chame o quarto do cron. O problema mais comum com o cron é que ele é executado com um mínimo de shell, então chame todos os scripts, incluindo o quarto script, pelo caminho completo.

Se você está tendo problemas com isso, poste sua entrada no cron e mais detalhes sobre o problema que você está tendo.

    
por Panther 05.03.2013 / 18:19
0

Em vez de chamar um novo script a cada minuto ou mais pelo cron, eu chamaria um script e colocaria todo o seu código nesse script. Em seguida, use o comando sleep (supondo que você esteja criando scripts no bash, senão o equivalente a essa linguagem de script), para aguardar um intervalo específico antes de executar a próxima parte do script. roteiro. Isso garantirá tempo entre os scripts e eles serão executados somente quando o outro script for concluído com êxito.

Um exemplo poderia ser:

Cron (execute o script a cada 15 min)

  

* / 15 * * * * / caminho / para / script

Script

 #!/bin/bash
 if command
       then
                   command executed successfully
                   sleep 120

       else
                   command failed so
                   execute all commands up to fi
       fi

Observe o sleep 120 que diz ao bash para esperar 2 minutos ou 120 segundos antes de executar a próxima linha.

    
por kingmilo 05.03.2013 / 18:40