Comment puis-je contrôler le nombre de processus en cours d’exécution?

Je fais un script shell et la situation inconnue s’est produite. Je dois exécuter un certain nombre de processus, supposons 12. Mais je veux limiter les exécutions à chaque fois. Donc, si ‘t’ vaut 3, je devrais exécuter 3 processus, puis 3, 3 et 3 enfin. Mais je voudrais le faire automatiquement, donc je dois surveiller ces processus en cours d’exécution et quand l’un d’eux est terminé, je dois en exécuter un des processus restants.

Après quelques recherches, j’ai trouvé la commande suivante:

launch backgroundprocess & PROC_ID=$! while kill -0 "$PROC_ID" >/dev/null 2>&1; do echo "PROCESS IS RUNNING" done echo "PROCESS TERMINATED" 

Proposé par cuonglm.

Cela peut aider à savoir si un processus est en cours d’exécution ou non. J’ai essayé de créer 12 processus et de les enregistrer dans 3 variables différentes, mais cela ne fonctionne pas correctement.

 processors=3 counter=0 for A in {1..12} do counter=$((counter+1)) backgroundprocess & PID[$A]=$! while [ $counter -eq $processors ] do if kill -0 "$PID[1]" >/dev/null 2>&1; then counter=$(($counter-1)) break fi done done 

Est-ce que l’un d’entre vous sait comment faire ce travail?

C’est l’amélioration de votre script.

ps -o pid= -p ${PID[$i]} renvoie le PID si le processus existe.

num représente le nombre de travaux terminés.

 processors=3 counter=0 num=0 for A in {1..12} do counter=$((counter+1)) sleep 4 & if [ $num -eq 0 ] then PID[$A]=$! else PID[$num]=$! fi echo "$A starts" echo $counter while [ $counter -eq $processors ] do for i in `seq 1 $processors` do if [ ! `ps -o pid= -p ${PID[$i]}` ] then counter=$(($counter-1)) echo "$i stopped" num=$i break fi done done done 

La commande intégrée des tâches du shell peut être utilisée pour compter les processus en arrière-plan.

Un fichier supplémentaire est utilisé pour attendre la fin des processus d’arrière-plan.

Essayez le script testé ci-dessous:

 #!/bin/bash -- tmp_file=/tmp/`date "+%Y%m%d%H%M%S$$"` rm -f "${tmp_file}" touch "${tmp_file}" max_nb_processes=12 max_parallel_nb_processes=3 nb_processes=0 while [ $nb_processes -lt $max_nb_processes ] do if [ `jobs -r | wc -l` -lt $max_parallel_nb_processes ] then (backgroundprocess ; printf "end" "" >> "${tmp_file}")& ((nb_processes ++)) else read -t 10 line < "${tmp_file}" fi done wait 

Pour référence, la première version.

La version testée ci-dessous utilise une interrogation:

 #!/bin/bash -- poll_time_second=10 max_nb_processes=12 max_parallel_nb_processes=3 nb_processes=0 while [ $nb_processes -lt $max_nb_processes ] do if [ `jobs -r | wc -l` -lt $max_parallel_nb_processes ] then backgroundprocess & ((nb_processes ++)) else sleep $poll_time_second fi done wait 

Tant qu'il y a moins de 3 processus d'arrière-plan, un nouveau processus est lancé en arrière-plan.

Lorsqu'il y a 3 processus en arrière-plan, le script veille 10 secondes avant de le vérifier à nouveau.

Lorsque 12 processus en arrière-plan ont été lancés, le script attend que les derniers se terminent avant de se terminer.

Les lots sont faciles, si vous ne vous souciez pas vraiment de garder les processeurs occupés.

 processors=3 counter=0 for A in {1..12} do backgroundprocess & ((counter++)) if ((counter == processors)); then wait # Block until all background jobs have completed counter=0 fi done