Exécutez simultanément deux commandes ou plus dans le script shell

Nov 28 2020

Il est souvent très utile d'exécuter des commandes en parallèle dans un script shell, mais je ne trouve pas de moyen de le faire. Est-ce possible? Si oui, comment pourrais-je y parvenir? Je suis principalement intéressé à faire ça pour fish.

C'est utile lorsque j'exécute des commandes qui prennent beaucoup de temps à se terminer mais qui peuvent ou doivent être exécutées en même temps pour réduire le temps nécessaire pour que tout se termine.

Réponses

5 KamilMaciorowski Nov 28 2020 at 16:03

L'approche la plus basique est avec &, cette autre réponse est juste. Il préconise également nohupmais nohupredirige stdin, stdout et stderr, quelque chose que vous voudrez peut-être ou non. Lire la différence entre nohup, disownet& et prendre une décision éclairée.

Une autre approche est parallel. Cela sera utile si les commandes que vous souhaitez paralléliser sont similaires les unes aux autres et que vous pouvez créer un motif.

La variante de base de l'outil (de moreutils, au moins dans Debian ) vous permet de limiter le nombre de travaux exécutés en même temps. GNUparallel est plus avancé. Si les travaux que vous souhaitez exécuter génèrent une sortie, les options suivantes seront particulièrement utiles:

--group
Sortie de groupe. La sortie de chaque travail est regroupée et n'est imprimée que lorsque la commande est terminée. Stdout (sortie standard) d'abord suivi de stderr (erreur standard). […]

( source )

( --groupest activé par défaut, vous n'avez donc généralement pas besoin de l'utiliser explicitement.)

--keep-order
-k
Gardez la séquence de sortie identique à celle de l'entrée. Normalement, la sortie d'un travail sera imprimée dès la fin du travail. […] -kN'affecte que l'ordre dans lequel la sortie est imprimée - pas l'ordre dans lequel les travaux sont exécutés.

( source )

Avec eux, la sortie de plusieurs travaux sera organisée, ce que vous ne pouvez pas obtenir &. Parfois, vous ne vous souciez pas de la sortie mais vous vous souciez toujours de la séquence; comme dans ma réponse où GNU parallelest utilisé pour paralléliser plusieurs curlprocessus et obtenir le statut de sortie de chacun, en conservant la séquence.

Dans Debian, GNU se paralleltrouve dans un paquet nommé parallel. Comme un exécutable séparé parallelpeut être exécuté à partir de n'importe quel shell.

2 Giacomo1968 Nov 28 2020 at 11:12

La meilleure façon de faire est de combiner le nohuppréfacé de la commande avec l' &ajout à la fin de la commande

Vous ne savez pas quel est votre objectif principal, mais j'espère que cela vous aidera!

Pour exécuter une commande en tant que processus d'arrière-plan sur une machine Linux, vous devez nohupajouter la commande &au début et l'ajouter à la fin.

La commande finale serait donc:

nohup [your command] &

Les nohupmoyens de la commande doit ignorer « accrochages » et l'esperluette qui y est &annexé est une commande shell qui indique au système d'exécuter la commande comme processus d'arrière - plan. Vous trouverez plus d'informations sur son utilisation ici .

Lorsque vous exécutez une commande comme celle-ci, le processus s'exécute, vous serez renvoyé à l'invite de commande et vous pouvez quitter la session de terminal ou même faire quelque chose d'autre sans rapport avec cette commande pendant cette session de terminal.