Esegui due o più comandi contemporaneamente nello script di shell
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
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.
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.