Executa um conjunto de processos no shell

5

Estou procurando um método fácil para executar N processos selecionados ao mesmo tempo com um comando. Ele deve colocar toda a saída no meu terminal e desligar todos eles quando eu sair com ctrl+c . Existe algum aplicativo existente que faz isso?

Estou pensando em algo como exec_many 10 foo - ele deve manter 10 foo s funcionando e reaparecer qualquer coisa que morre.

    
por viraptor 21.04.2010 / 12:28

2 respostas

5

Eu não sei de uma mão, mas você poderia fazer isso com Bash sem muito trabalho. Eu colocaria cada um dos processos foo em um grupo de processos. Você pode capturar SIGINT no pai e matar o grupo de processos com kill -pgid (Negativo antes do número do grupo de processos). Você também pode iniciá-los todos como trabalhos. Então todos eles correm de uma vez (basicamente). Finalmente, você poderia fazer um loop sobre a saída de jobs a cada x segundos (dormir no loop) e obter a contagem, se a contagem for menor que o número de processos foo, do que você pode acionar outro. certeza de que nenhum está parado, etc.).

Uma versão aproximada pode ser algo como:

#!/bin/bash

command=$1
n_job=$2

function kill_jobs {
    echo traped
    for job in $(jobs -p); do
        echo killing $job
        kill $job
    done
} 

trap 'kill_jobs; exit' SIGINT

while true; do
    current_jobs=$(jobs -pr)
    x=0;
    for job in $current_jobs; do
        (( x++ ))
    done;

    jobs_to_run=$(($n_job - $x))

    for (( y = 0; y < $jobs_to_run; y++ )); do
        $command &
    done
    x=0 
    sleep 5
done

Você também pode encontrar coisas parecidas na seção "Proccesses and Concurrency" do Pythton for Unix e Linux System Adminsitration.

    
por 21.04.2010 / 13:00
3

Do synaptic ....

build and execute command lines from standard input in parallel

GNU Parallel is a shell tool for executing jobs in parallel using one or more machines. A job is typically a single command or a small script that has to be run for each of the lines in the input. The typical input is a list of files, a list of hosts, a list of users, or a list of tables.

If you use xargs today you will find GNU Parallel very easy to use. If you write loops in shell, you will find GNU Parallel may be able to replace most of the loops and make them run faster by running jobs in parallel. If you use ppss or pexec you will find GNU Parallel will often make the command easier to read.

GNU Parallel also makes sure output from the commands is the same output as you would get had you run the commands sequentially. This makes it possible to use output from GNU Parallel as input for other programs.

    
por 18.12.2012 / 02:32