2012-07-14 15 views
11

Ho un file contenente le righe di comando che voglio eseguire. Questo file contiene circa 2000 linee.Come posso eseguire un elenco di comandi in parallelo?

Sono disponibili 8 core. È possibile analizzare il file e avviare 8 processi, quindi eseguirne un altro dal file quando termina uno dei programmi? Voglio che questo continui fino al raggiungimento della fine del file.

+0

Vedere [Gestione processo] (http://mywiki.wooledge.org/ProcessManagement). –

risposta

18

È possibile utilizzare xargs per leggere nel file, limitando il numero massimo di processi al numero di core disponibili. Ad esempio:

cores=$(fgrep -c processor /proc/cpuinfo) 
xargs --arg-file=/tmp/foo \ 
     --max-procs=$cores \ 
     --replace \ 
     --verbose \ 
     /bin/sh -c "{}" 
+1

La migliore soluzione –

0

È possibile avviare nuovi processi sullo sfondo semplicemente eseguendo un comando con &. C'è un esempio here che descrive una soluzione del tuo problema.

28

Utilizzare GNU parallel. È uno strumento incredibilmente potente e esistono pacchetti ufficiali per circa 20 distribuzioni di Linux. Cos'è quello? You have an excuse as to why you can't use it? Ecco un semplice esempio che mostra come eseguire un elenco o un file di comandi in parallelo:

Contenuto del jobs.txt:

sleep 1; echo "a" 
sleep 3; echo "b" 
sleep 2; echo "c" 

comando:

time parallel :::: jobs.txt 

Risultati:

a 
c 
b 

real 0m3.332s 
user 0m0.170s 
sys  0m0.037s 

Note:

Se si desidera mantenere l'ordine come input, passare il flag -k a GNU parallelo.

Se si dispone di più di otto core e si desidera elaborare solo con otto core, aggiungere -j 8 all'elenco di argomenti.

man page è una buona lettura, ma se non hai già letto this tutorial ti consiglio caldamente l'investimento nel tempo.

+0

GNU parallel non è disponibile su Ubuntu 11.10, ma è disponibile su Debian sid. Vale anche la pena notare che questo esempio * non * funzionerà così com'è con l'utilità parallela dal pacchetto moreutils, che ha una semantica diversa. –

+0

-j 8 non è necessario: viene rilevato automaticamente. Pacchetto di Ubuntu: https://build.opensuse.org/package/binaries?package=parallel&project=home%3Atange&repository=xUbuntu_11.10 –

+0

Per eseguire comandi da un file in parallelo si potrebbe fare 'cat/path/to/file .txt | parallel' –