2010-11-23 6 views
4

Disons que j'ai 10 scripts que je veux exécuter régulièrement en tant que tâches cron. Cependant, je ne veux pas que tous courent en même temps. Je veux seulement 2 d'entre eux fonctionnant simultanément.Planification de processus

Une solution à laquelle je pense est de créer deux scripts, mettre 5 instructions sur chacun d'entre eux, et comme des entrées séparées dans la crontab. Cependant, la solution semble très adhoc.

Existe-t-il un outil Unix pour effectuer la tâche mentionnée ci-dessus?

+0

Avez-vous besoin d'exécuter ces scripts selon un certain ordre? – ajreal

+0

@ajreal, non Je n'ai pas besoin d'un ordre spécifique - ils sont indépendants les uns des autres. –

Répondre

1

Le composant intégré jobs peut vous indiquer le nombre de processus enfants en cours d'exécution. Certains scripts shell simple peut accomplir cette tâche:

MAX_JOBS=2 

launch_when_not_busy() 
{ 
    while [ $(jobs | wc -l) -ge $MAX_JOBS ] 
    do 
     # at least $MAX_JOBS are still running. 
     sleep 1 
    done 
    "[email protected]" & 
} 

launch_when_not_busy bash job1.sh --args 
launch_when_not_busy bash jobTwo.sh 
launch_when_not_busy bash job_three.sh 
... 
wait 
+0

celui-ci semble intéressant. Je vais essayer et vous dire comment ça se passe. –

1

REMARQUE: Comme indiqué par mobrule, ma réponse d'origine ne fonctionnera pas car l'attente intégrée sans arguments attend que TOUS les enfants terminent. D'où le script « parallelexec » suivant, ce qui évite l'interrogation au détriment des autres processus enfants:

#!/bin/bash 

N="$1" 

I=0 

{ 
     if [[ "$#" -le 1 ]]; then 
       cat 
     else 
       while [[ "$#" -gt 1 ]]; do 
         echo "$2" 

         set -- "$1" "${@:3}" 
       done 
     fi 
} | { 
     d=$(mktemp -d /tmp/fifo.XXXXXXXX) 

     mkfifo "$d"/fifo 

     exec 3<>"$d"/fifo 

     rm -rf "$d" 

     while [[ "$I" -lt "$N" ]] && read C; do 
       ($C; echo >&3) & 

       let I++ 
     done 

     while read C; do 
       read -u 3 

       ($C; echo >&3) & 
     done 
} 

Le premier argument est le nombre d'emplois parallèles. S'il y en a plus, chacun est exécuté comme un travail, sinon toutes les commandes à exécuter sont lues à partir de stdin ligne par ligne.

J'utilise un tube nommé (qui est envoyé à l'oubli dès que le shell l'ouvre) comme méthode de synchronisation. Puisque seuls des octets uniques sont écrits, il n'y a pas de problèmes de condition de concurrence qui pourraient compliquer les choses.

+0

builtin attend que * tout * des processus fils se termine – mob

+0

true, oublié à propos de cette mort cérébrale particulière. En remplaçant par fds/read ... – thkala

1

parallèle GNU est conçu pour ce genre de tâches:

sem -j2 do_stuff 
sem -j2 do_other_stuff 
sem -j2 do_third_stuff 

do_third_stuff ne sera exécutée que lorsque l'do_stuff ou do_other_stuff a fini.

Regarder les vidéos d'intro Les pour en savoir plus:

http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1