Esegui due o più comandi contemporaneamente nello script di shell

Nov 28 2020

Spesso è molto utile eseguire comandi in parallelo in uno script di shell, ma non riesco a trovare il modo per farlo. È possibile? In caso affermativo, come potrei ottenerlo? Sono principalmente interessato a farlo per fish.

È utile quando eseguo comandi che richiedono molto tempo per essere completati ma che possono o devono essere eseguiti contemporaneamente per ridurre il tempo necessario affinché tutto finisca.

Risposte

5 KamilMaciorowski Nov 28 2020 at 16:03

L'approccio più semplice è con &, quest'altra risposta è giusta. Supporta anche nohupma nohupreindirizza stdin, stdout e stderr, qualcosa che potresti o non potresti volere. Leggi Differenza tra nohup, disowne& e prendi una decisione consapevole.

Un altro approccio è parallel. Sarà utile se i comandi che vuoi parallelizzare sono simili tra loro e puoi creare un pattern.

La variante di base dello strumento (da moreutils, almeno in Debian ) consente di limitare il numero di lavori che vengono eseguiti contemporaneamente. GNUparallel è più avanzato. Se i lavori che desideri eseguire generano l'output, le seguenti opzioni saranno particolarmente utili:

--group
Uscita di gruppo. L'output di ciascun lavoro viene raggruppato e viene stampato solo al termine del comando. Stdout (output standard) prima seguito da stderr (errore standard). [...]

( fonte )

( --groupè abilitato per impostazione predefinita, quindi di solito non è necessario utilizzarlo esplicitamente.)

--keep-order
-k
Mantieni la sequenza di output uguale all'ordine di input. Normalmente l'output di un lavoro verrà stampato non appena il lavoro sarà completato. […] -kInfluisce solo sull'ordine in cui viene stampato l'output, non sull'ordine in cui vengono eseguiti i lavori.

( fonte )

Con loro verrà organizzato l'output di più lavori, qualcosa da cui non puoi ottenere &. A volte potresti non preoccuparti dell'output ma ti interessa comunque la sequenza; come in questa mia risposta in cui GNU parallelviene utilizzato per parallelizzare più curlprocessi e ottenere lo stato di uscita da ciascuno, mantenendo la sequenza.

In Debian GNU si paralleltrova in un pacchetto denominato parallel. Come eseguibile separato parallelpuò essere eseguito da qualsiasi shell.

2 Giacomo1968 Nov 28 2020 at 11:12

Il modo migliore per farlo è combinare la nohupprefazione del comando con quella &aggiunta alla fine del comando

Non è chiaro quale sia il tuo obiettivo principale, ma spero che ti aiuti!

Per eseguire qualsiasi comando come processo in background su una macchina Linux, è necessario anteporre il comando nohupe aggiungerlo &alla fine.

Quindi il comando finale sarebbe:

nohup [your command] &

I nohupmezzi il comando deve ignorare “appendere up” e la e commerciale &allegata è un comando di shell che dice al sistema di eseguire il comando come processo in background. Maggiori informazioni sul suo utilizzo possono essere trovate qui .

Quando esegui un comando come questo, il processo verrà eseguito, verrai rimandato al prompt dei comandi e potrai uscire dalla sessione del terminale o persino andare a fare qualcos'altro non correlato a quel comando durante quella sessione del terminale.